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

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查询写法:

  1. 对象写法(适配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:06:07