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
相关产品推荐
相关产品推荐

