使用TypeORM关联查询遇EntityPropertyNotFoundError问题求助
TypeORM关联查询加载指定字段报错解决
问题背景
使用TypeORM的find选项加载关联数据时出错,代码参考官方示例但无法正常运行。
关联查询代码
await this.userRepository.findOneOrFail({ where: { id }, relations: { cursos: { nome: true } }, });
实体定义
Users实体
@Entity({ name: 'users' }) export class Users { @PrimaryGeneratedColumn() id: number; @Columns() // 此处存在拼写错误,应为@Column() nome: string; @OneToMany(() => Courses, (course) => course.user) cursos: Courses[]; }
Courses实体
@Entity({ name: 'cursos' }) export class Courses { @PrimaryColumn({ nullable: false }) id: number; @Column() nome: string; @Column() user_id: number; @ManyToOne(() => Users, (user) => user.cursos) @JoinColumn({ name: 'user_id', referencedColumnName: 'id' }) user: Users; }
期望结果
{ "id": 1, "nome": "Rogerio", "cursos": [ { "nome": "BACHARELADO EM ENG DE COMPUTAÇÃO" } ] }
报错信息
[ExceptionsHandler] Property "nome" was not found in "Courses". Make sure your query is correct. EntityPropertyNotFoundError: Property "nome" was not found in "Courses". Make sure your query is correct.
问题原因及解决方法
1. 修复实体注解拼写错误
Users实体中的@Columns()是笔误,必须改为@Column(),错误的注解会导致实体字段映射异常,间接引发关联查询的字段识别问题。
2. 修正relations选项用法
TypeORM的relations参数仅用于指定要加载的关联关系(即是否加载cursos关联),不能在其中指定要选择的字段。要实现只加载关联实体的特定字段,有两种可行方案:
方案一:使用select结合relations(适用于TypeORM 0.3.x及以上版本)
await this.userRepository.findOneOrFail({ where: { id }, relations: ["cursos"], select: { id: true, nome: true, cursos: { nome: true } } });
方案二:使用QueryBuilder(更灵活,推荐)
await this.userRepository.createQueryBuilder('user') .select(['user.id', 'user.nome', 'curso.nome']) .leftJoin('user.cursos', 'curso') .where('user.id = :id', { id }) .getOne();
内容的提问来源于stack exchange,提问作者RVenancio
相关产品推荐
相关产品推荐

