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

如何在TypeORM中结合Bracket使用where in子句?

TypeORM QueryBuilder结合Bracket与IN子句报错解决方法

问题场景

使用TypeORM的QueryBuilder构建SQL查询时,尝试在Brackets中结合OR条件与IN子句,触发TypeError: value.map is not a function错误,相关代码及错误信息如下:

代码示例

const users = [
  {
    name: 'user1',
    age: 20,
    nickname: 'u1'
  },
  {
    name: 'user2',
    age: 24,
    nickname: 'u2'
  },
  {
    name: 'user3',
    age: 42,
    nickname: 'u3'
  }
];
const queryBuilder = this.queryBuilder();

queryBuilder.where(
  new Brackets((qb) => {
    qb.orWhere('user.nickname IN (:...nicknames)', { nicknames: users.map((user) => user.nickname) });
    qb.orWhere(...); // 未完善的OR条件占位符
  })
);

// ...其他逻辑

return queryBuilder.getMany();

错误信息

TypeError: value.map is not a function

问题原因与修复方法

该错误主要是因为Brackets回调中orWhere的参数传递不符合TypeORM预期,尤其是未完善的qb.orWhere(...)占位符导致内部参数处理异常。以下是正确实现方式:

1. 完善所有orWhere参数传递

确保每个orWhere都传递有效的条件字符串及参数对象(如果需要),示例如下:

queryBuilder.where(
  new Brackets((qb) => {
    // 正确编写IN子句,使用:...语法展开数组
    qb.orWhere('user.nickname IN (:...nicknames)', { 
      nicknames: users.map(user => user.nickname) 
    });
    // 添加其他OR条件,示例:匹配指定年龄
    qb.orWhere('user.age = :targetAge', { targetAge: 24 });
  })
);

2. 用where初始化首条件,orWhere追加后续条件

更稳妥的写法是先用where设置Brackets内的第一个条件,再通过orWhere追加其他OR条件:

queryBuilder.where(
  new Brackets((qb) => {
    qb.where('user.nickname IN (:...nicknames)', { 
      nicknames: users.map(user => user.nickname) 
    });
    qb.orWhere('user.age > :minAge', { minAge: 18 });
  })
);

3. 处理空数组边界情况

如果users.map(user => user.nickname)返回空数组,IN子句会引发SQL语法错误,需提前判断处理:

const nicknames = users.map(user => user.nickname);

queryBuilder.where(
  new Brackets((qb) => {
    if (nicknames.length === 0) {
      // 添加恒假条件避免SQL错误
      qb.where('1 = 0');
    } else {
      qb.where('user.nickname IN (:...nicknames)', { nicknames });
    }
    qb.orWhere('user.age BETWEEN :min AND :max', { min: 20, max: 40 });
  })
);

内容的提问来源于stack exchange,提问作者Jiho Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:03:30