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

如何在TypeORM Query Builder中正确处理AND与OR逻辑

正确实现目标SQL的TypeORM写法

你当前的代码生成的SQL逻辑不符合预期,因为orWhere和andWhere的组合会导致优先级问题——实际生成的SQL是WHERE id = 1 OR (id = 2 AND status = 2),而你需要的是(id = 1 OR id = 2) AND status = 2。

以下是两种正确的实现方式:

方案一:使用IN操作符(更简洁)

当需要匹配多个id值时,用IN操作符是最直观的写法,生成的SQL和目标逻辑完全一致:

const result = await connection
  .getRepository(Users)
  .createQueryBuilder("users")
  .select(['name'])
  .where("users.id IN (:...ids)", { ids: [1, 2] })
  .andWhere("users.status = :status", { status: 2 })
  .getMany();

方案二:显式分组OR条件

如果需要保留OR的写法,可以通过括号显式分组条件,确保逻辑优先级正确:

方式1:直接写带括号的条件字符串

const result = await connection
  .getRepository(Users)
  .createQueryBuilder("users")
  .select(['name'])
  .where("(users.id = :id1 OR users.id = :id2)", { id1: 1, id2: 2 })
  .andWhere("users.status = :status", { status: 2 })
  .getMany();

方式2:用回调函数构建分组条件

通过where的回调函数可以更灵活地组合嵌套条件:

const result = await connection
  .getRepository(Users)
  .createQueryBuilder("users")
  .select(['name'])
  .where(qb => {
    qb.where("users.id = :id1", { id1: 1 })
      .orWhere("users.id = :id2", { id2: 2 });
  })
  .andWhere("users.status = :status", { status: 2 })
  .getMany();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:25:43