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

NestJS+TypeORM查询PostgreSQL时无法获取关联外键字段

问题原因与解决方案

你的问题出在实体类的关联字段定义不符合TypeORM规范,导致查询时无法正确返回entityId和userId字段。

问题分析

你用@ManyToOne装饰了entityId和userId字段,但将它们的类型定义为number。在TypeORM中,@ManyToOne装饰的字段应该对应关联实体的实例(比如Entity2或UserEntity的对象),而非直接存储外键值的数字类型。这种错误定义会让TypeORM把这两个字段识别为关联实体的引用,而非普通数据库列,因此查询时不会返回它们的数值。

解决方案

方案1:修正实体定义(推荐)

区分外键列和关联实体字段,分别定义:

@Entity("my_entity")
export class MyEntity {
  /**
   * Id autoincreament
   */
  @PrimaryGeneratedColumn()
  id: number;

  // 定义外键列,对应数据库中的entity_id字段
  @Column({ name: "entity_id" })
  @IsInt()
  @IsNotEmpty()
  entityId: number;

  // 定义关联实体,关联到Entity2
  @ManyToOne(() => Entity2)
  @JoinColumn({ name: "entity_id" })
  entity2: Entity2;

  // 定义外键列,对应数据库中的user_id字段
  @Column({ name: "user_id" })
  @IsInt()
  @IsNotEmpty()
  userId: number;

  // 定义关联实体,关联到UserEntity
  @ManyToOne(() => UserEntity)
  @JoinColumn({ name: "user_id" })
  user: UserEntity;
}

修改后,原查询代码无需改动,select: ["id", "entityId", "userId"]就能正确返回这三个字段的值。

方案2:不修改实体,调整查询语句(临时 workaround)

如果暂时不想修改实体,可以通过关联实体的id属性指定查询字段:

const query: any = {
  where: {
    entityId: In([1,2,3]),
  },
  select: ["id", "entityId.id", "userId.id"]
};

不过这种方法不建议长期使用,因为实体定义本身不符合TypeORM设计规范,后续容易引发其他问题。

内容的提问来源于stack exchange,提问作者Code Guru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:42:31