TypeORM:SQL一对一左连接转Query Builder实现问题
TypeORM Query Builder 左连接转换问题解决
问题原因
你的UserData实体中没有定义与Issuer的反向关联关系,而QueryBuilder的leftJoin('user.public_address', 'issuer')试图将普通字段public_address当作实体关联来使用,这就导致了Relation with property path public_address in entity was not found错误。
解决方案
方案1:补充实体反向关联(推荐)
先在UserData实体中添加与Issuer的反向OneToOne关联:
@Entity('user_data') export class UserData { @PrimaryColumn({ type: 'varchar', unique: true }) email: string @Column({ type: 'varchar', nullable: false, unique: true }) public_address: string // 添加反向关联,关联Issuer的u_data字段 @OneToOne(() => Issuer, issuer => issuer.u_data) issuer: Issuer ...remaining columns... }
然后修改QueryBuilder代码,使用这个关联进行左连接:
// 如果需要查询Issuer的字段,用leftJoinAndSelect;如果只需要关联过滤,用leftJoin await this.userRepository .createQueryBuilder('user') .leftJoinAndSelect('user.issuer', 'issuer') .where('user.email = :email', { email }) .getOne()
方案2:直接使用原生连接条件(无需修改实体)
如果不想修改实体结构,可以直接指定连接的字段条件,绕过实体关联:
await this.userRepository .createQueryBuilder('user') .leftJoin(Issuer, 'issuer', 'issuer.issuer_id = user.public_address') .where('user.email = :email', { email }) .getOne()
验证
两种方案都能实现你想要的SQL左连接逻辑,最终生成的SQL会和你手动编写的LEFT OUTER JOIN issuer ON issuer.issuer_id = user_data.public_address一致。
内容的提问来源于stack exchange,提问作者Ahmet Yazıcı
相关产品推荐
相关产品推荐

