TypeORM如何通过主实体QueryBuilder查询多对一链路的三级依赖实体
问题根因
你的查询写不对是实体关联配置的错误导致的,和嵌套join的逻辑本身没关系:
- 关联属性名不匹配:
SecondEntity中@OneToMany配置的反向映射字段是third.secondEntity,但ThirdEntity里对应的关联字段实际命名为second,映射链路断裂 ThirdEntity漏加@Entity装饰器,TypeORM不会将其识别为数据库实体,关联查询自然失效ThirdEntity的@ManyToOne反向关联配置错误,第二个参数应该指向SecondEntity中对应的OneToMany属性third,而不是second.id- 你贴的QueryBuilder代码只写了关联逻辑,没有加最终的查询执行方法(比如
.getMany()/.getOne())
修正方案
步骤1:修正实体配置
// MainEntity 不需要调整,保持原有配置即可 @Entity('main_entity') export class MainEntity { @PrimaryGeneratedColumn('increment') @IsInt() id: number; @OneToOne( () => SecondEntity, (second) => second.main, ) second: SecondEntity; }
// SecondEntity 调整OneToMany的反向映射字段 @Entity('second_entity') export class SecondEntity { @PrimaryGeneratedColumn() @IsInt() id: number; @OneToOne(() => MainEntity) @JoinColumn() main: MainEntity; // 这里的third.second要和ThirdEntity里的关联字段名对应 @OneToMany(() => ThirdEntity, (third) => third.second) third: ThirdEntity[]; }
// ThirdEntity 补@Entity装饰器,修正ManyToOne配置 @Entity('third_entity') export class ThirdEntity { @PrimaryGeneratedColumn() @IsInt() id: number; @Column() @Length(1, 255) name: string; // 反向关联指向SecondEntity里的third属性 @ManyToOne(() => SecondEntity, (second) => second.third) second: SecondEntity; }
步骤2:补全QueryBuilder执行逻辑
const query = await this.createQueryBuilder('main') .leftJoinAndSelect('main.second', 'second') .leftJoinAndSelect('second.third', 'third') // 补全执行方法,根据你的需求选getMany(查列表)/getOne(查单条) .getMany();
排查小技巧
如果后续还有关联查询问题,可以在QueryBuilder后调用.getSql()打印生成的原生SQL,就能快速判断是关联配置错了还是查询逻辑写错了。
内容的提问来源于stack exchange,提问作者NZWhale
相关产品推荐
相关产品推荐

