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

