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

NestJS+TypeORM关联查询报Not unique table/alias: 'users'错误如何解决

问题原因
  • 查询构建器的关联别名重复:两次调用leftJoinAndSelect方法时,都给关联的用户表指定了相同别名users,最终生成的SQL语句中会存在两个重名的表别名,数据库无法区分,直接触发ER_NONUNIQ_TABLE 1066错误。
  • 实体定义存在类型错误:@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:54:01