NestJS+TypeORM关联查询报Not unique table/alias: 'users'错误如何解决
问题原因
- 查询构建器的关联别名重复:两次调用
leftJoinAndSelect方法时,都给关联的用户表指定了相同别名users,最终生成的SQL语句中会存在两个重名的表别名,数据库无法区分,直接触发ER_NONUNIQ_TABLE1066错误。 - 实体定义存在类型错误:
@ManyToOne为多对一关联,对应的属性应该是单个UserEntity类型,当前代码写为UserEntity[]是一对多关联的类型写法,虽不会直接触发当前报错,但后续数据映射时会出现异常。
解决方案
1. 修正实体定义
将两个关联属性的数组类型改为单个实体类型:
@Entity('leave') export class LeaveEntity { @PrimaryGeneratedColumn('increment') id: number; // 审批人与用户的关联关系 @ManyToOne(() => UserEntity, u => u.id, { eager: false, cascade: false, nullable: true }) approvedBy: UserEntity; // 去掉数组标识 // 请假单与提交用户的关联关系 @ManyToOne(() => UserEntity, user => user.id, { eager: false, cascade: false, nullable: false }) user: UserEntity; // 去掉数组标识 }
2. 修正查询构建器的别名配置
给两个不同的关联字段指定不同的别名,查询时按别名选择对应字段即可:
const qb = getRepository(LeaveEntity) .createQueryBuilder("leave") .skip(size * (page - 1)) .take(size) .orderBy('leave.created_at', orderBy) // 给审批人关联指定别名approver .leftJoinAndSelect("leave.approvedBy", "approver") // 给提交人关联指定别名submitter .leftJoinAndSelect("leave.user", "submitter") // 按别名选择对应字段 .select(['leave', 'approver.email', 'approver.id', 'approver.firstName', 'approver.lastName', 'submitter.email', 'submitter.id', 'submitter.firstName', 'submitter.lastName' ]) const [items, total] = await qb.getManyAndCount(); return {items, total, page: +page, totalPages: Math.ceil(total/size)}
修改后TypeORM会自动把别名对应的数据映射到实体的approvedBy和user属性中,无需额外处理。
内容的提问来源于stack exchange,提问作者The Mechanic
相关产品推荐
相关产品推荐

