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

Nestjs TypeORM报syntax error at or near "AND"错误如何解决?

问题根因

你遇到的TypeORM syntax error at or near "AND"报错是同一实体配置多个可选、eager加载的OneToOne关联触发的TypeORM SQL生成BUG:TypeORM拼接多表LEFT JOIN的过滤条件时,会生成多余的AND关键字,导致语法错误。把eager改为false后不需要关联查询,自然不会触发该BUG。


解决方案

你可以根据业务场景选择以下任意一种方式修复:

  • 方案1:关闭实体默认eager加载,查询时手动指定关联(最推荐)
    先把User实体两个OneToOne关联的eager: true删除,调整查询方法手动指定要加载的关联,既可以满足业务取关联数据的需求,也避免全局eager加载带来的额外查询开销:
    async findByRA(academicRegister: string) {
      return await this.userRepository.findOne({
        where: { academicRegister: academicRegister },
        // 手动指定需要加载的关联数据
        relations: ['coordinator', 'monitor']
      });
    }
    
  • 方案2:保留eager加载,为关联添加@JoinColumn明确外键映射
    如果需要全局默认加载这两个关联,给User的两个OneToOne关联都加上@JoinColumn()注解,明确外键映射规则,即可修复SQL生成错误:
    @OneToOne(() => Coordinator, (coordinator) => coordinator.user, {
      eager: true,
      nullable: true,
      cascade: ['insert', 'update', 'soft-remove', 'recover'],
    })
    @JoinColumn() // 标记当前实体为关联关系拥有方,明确外键生成规则
    coordinator?: Coordinator;
    
    @OneToOne(() => Monitor, (monitor) => monitor.user, {
      eager: true,
      nullable: true,
      cascade: ['insert', 'update', 'soft-remove', 'recover'],
    })
    @JoinColumn()
    monitor?: Monitor;
    
    注意:如果子实体中已经自定义了userId作为外键列,需要指定外键名和自定义列对应:@JoinColumn({ name: 'userId' }),避免重复生成外键列。
  • 方案3:升级TypeORM版本
    该BUG在TypeORM 0.3.x以上稳定版本已被修复,如果当前依赖版本较低,可以直接升级TypeORM到最新正式版解决问题。

验证方式

可以在TypeORM配置中开启logging: true,打印执行的SQL语句,确认修改后生成的查询语法正确。

内容的提问来源于stack exchange,提问作者Jônathas Leandro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:24:10