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
相关产品推荐
相关产品推荐

