TypeORM如何仅当存在有效值时动态添加WHERE IN查询条件
TypeORM 0.2.40 动态添加IN查询条件方案
前置准备
首先需要从TypeORM中导入In操作符:
import { In } from 'typeorm';
问题1:动态添加IN条件的实现方式
和params.company的处理逻辑完全一致,通过对象扩展运算符+短路判断实现即可,不需要额外调用andWhere也能实现:
const { params } = parseRequest(); const userIds = params.user_ids; const whereCondition = { firstName: 'John', // 仅company存在时添加条件 ...(params.company && { company: params.company }), // 仅userIds存在且不为空数组时添加IN条件 ...(userIds?.length && { id: In(userIds) }) }; // 直接传入find方法即可 const result = await myRepository.find({ where: whereCondition });
如果要保持你现有SelectQueryBuilder的链式写法,也可以单独做判断后添加:
const query: SelectQueryBuilder<MyEntity> = ...; query.where({ firstName: 'John', ...(params.company && { company: params.company }), }); // 单独判断后加IN条件,可读性更强 if (userIds?.length) { query.andWhere({ id: In(userIds) }); }
注意:判断条件用userIds?.length可以同时过滤undefined和空数组两种无效场景,避免生成IN ()的非法SQL引发报错
问题2:IN查询的正确语法
TypeORM 0.2.40版本支持两种合法的IN查询写法:
- 对象写法(适配find方法和QueryBuilder)
用内置In操作符包裹数组即可,示例:
where: { id: In([1,2,3]) }
生成的SQL为:WHERE id IN (1,2,3)
2. QueryBuilder原生参数写法
如果用QueryBuilder的字符串条件写法,需要用(:...参数名)的语法让TypeORM自动展开数组,示例:
query.andWhere('my_entity.id IN (:...userIds)', { userIds: [1,2,3] })
这种写法会自动对数组元素做转义处理,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者user842225
相关产品推荐
相关产品推荐

