TypeORM报错:实体中未找到owner关联,如何排查修复?
问题:TypeORM关联查询报错"Relation with property path owner in entity was not found"
问题场景
使用TypeORM+NestJS+MySQL,Order实体中定义了owner和client两个ManyToOne关联指向User实体,但执行查询时,leftJoinAndSelect('order.owner')报错,client关联却正常。
相关代码
Order实体
@Entity() export class Order { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => Media, (media) => media.id, { eager: false }) media: Media @Column({ type: 'enum', enum: OrderStatus, default: OrderStatus.WAITING }) status: OrderStatus @ManyToOne(() => User, (user) => user.id) @JoinColumn({ name: 'ownerId' }) owner: User @ManyToOne(() => User, (user) => user.id) @JoinColumn({ name: 'clientId' }) client: User @Column() description: string @Column({ nullable: true, default: null }) score: number | null @CreateDateColumn({ type: 'timestamp' }) createdAt: Date; @UpdateDateColumn({ type: 'timestamp' }) updatedAt: Date @DeleteDateColumn() deletedAt: Date @BeforeUpdate() private validateScore() { if (this.score !== null && (this.score < 0 || this.score > 100)) { throw new Error('Score must be between 0 and 100'); } } }
User实体
import { Role } from 'src/common/authorization/role.enum'; import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column({ unique: true }) email: string; @Column() password: string; @Column({ default: Role.User }) role: Role; @Column({ default: null }) verifiedAt: Date | null }
查询服务代码
async findAll(role: Role, query: GetOrdersQueryDto) { const page = query.page || 1; const itemPerPage = query.item_per_page || 10; const theQuery = this.orderRepository.createQueryBuilder('order') const [data,totalCount]=await theQuery .leftJoinAndSelect('order.owner ','user') // 报错位置 .leftJoinAndSelect('order.client','user') .orderBy('order.createdAt') .skip((page-1)*itemPerPage) .take(itemPerPage) .getManyAndCount() return { data, pagination: { total_count: totalCount, item_per_page: itemPerPage, page }, }; }
报错信息
Relation with property path owner in entity was not found.
问题原因
- 关联路径存在多余空格:报错行的
'order.owner '中,owner后面多了一个空格,导致TypeORM解析时无法匹配到Order实体中定义的owner属性 - 关联别名重复:两次
leftJoinAndSelect都使用了user作为别名,即使去掉空格,后续也会引发别名冲突问题
修复方案
修改查询代码,移除关联路径的空格,并为两个User关联设置不同的别名:
async findAll(role: Role, query: GetOrdersQueryDto) { const page = query.page || 1; const itemPerPage = query.item_per_page || 10; const theQuery = this.orderRepository.createQueryBuilder('order') const [data,totalCount]=await theQuery .leftJoinAndSelect('order.owner', 'ownerUser') // 移除空格,更换别名 .leftJoinAndSelect('order.client', 'clientUser') // 更换别名 .orderBy('order.createdAt') .skip((page-1)*itemPerPage) .take(itemPerPage) .getManyAndCount() return { data, pagination: { total_count: totalCount, item_per_page: itemPerPage, page }, }; }
修复后,查询结果中每个Order对象的owner和client字段会自动映射对应的关联数据,无需额外处理。
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

