You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:55:13