TypeORM跨Schema关联查询报错:别名未找到,求解决思路
我来帮你拆解下这个问题,报错的核心原因是你在QueryBuilder里引用关联的方式不对,导致TypeORM找不到对应的别名。下面一步步给你解决思路:
1. 错误根源分析
你写的leftJoinAndSelect("a.photo", "photosA")是典型的误区——QueryBuilder里关联实体的时候,不能直接用schema+表名的格式,而是要从你定义的主查询别名(这里是userB)出发,引用实体类上已经定义好的关联属性名。
看你的UserB实体,已经明确定义了两个OneToMany关联:
photosA:关联到schema a里的PhotoA实体photosB:关联到schema b里的PhotoB实体
所以你应该通过userB.photosA和userB.photosB来引用这些关联,而不是直接写a.photo或b.photo。
2. 修正后的查询代码
把你的查询部分改成下面这样:
const result = await userBRepo .createQueryBuilder("userB") .select("*") .leftJoinAndSelect("userB.photosA", "photosA") // 引用UserB的photosA关联属性 .leftJoinAndSelect("userB.photosB", "photosB") // 引用UserB的photosB关联属性 .where({id: userBSavedRow.id}) .getOne();
3. 额外的小问题修复
你的测试代码里还有一个笔误:保存PhotoB的时候,错误地调用了photoARepo.save(photoARow),应该改成photoBRepo.save(photoBRow),否则会重复保存PhotoA的数据,而PhotoB的数据根本没存进去:
// 原来的错误代码 // await photoARepo.save(photoARow); // 修正后 await photoBRepo.save(photoBRow);
4. 跨Schema关联的注意事项
TypeORM处理跨Schema关联的时候,只要你在实体上通过@Entity({schema: "xxx"})指定了所属schema,并且关联装饰器(@ManyToOne/@OneToMany)正确指向了目标实体,TypeORM会自动生成跨Schema的关联查询SQL,不需要你手动在QueryBuilder里指定schema。
比如你的PhotoA实体里的@ManyToOne(type => UserB) userB: UserB;,TypeORM会自动识别UserB属于schema b,生成关联的时候会正确关联到b.user表。
内容的提问来源于stack exchange,提问作者Lewis

