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

TypeORM中多OR结合AND查询的更优实现方式?

解决TypeORM中分组AND/OR查询的更优方案

不用枚举所有条件组合,有两种简洁的方式实现你需要的(OR条件组) AND (OR条件组)查询:

方法一:使用TypeORM内置的条件构造器

通过And和Or构造函数可以直接嵌套组合条件,避免枚举所有组合:

首先导入所需工具:

import { And, Or, Like, In } from "typeorm";

然后编写查询:

// 方式1:用Or组合多个age条件
const users = await userRepository.find({
  where: And(
    Or(
      { age: 20 },
      { age: 22 },
      { age: 23 }
    ),
    Or(
      { name: Like('%kan%') },
      { username: Like('%kan%') }
    )
  )
});

// 更简洁的方式:用In替代多个age的OR条件
const users = await userRepository.find({
  where: And(
    { age: In([20, 22, 23]) },
    Or(
      { name: Like('%kan%') },
      { username: Like('%kan%') }
    )
  )
});

方法二:使用QueryBuilder(更灵活的复杂查询方案)

QueryBuilder支持链式调用和分组条件,可读性和扩展性更强:

// 方式1:用IN简化age条件,配合OR组合名称查询
const users = await userRepository.createQueryBuilder("user")
  .where("user.age IN (:...ages)", { ages: [20, 22, 23] })
  .andWhere("user.name LIKE :search OR user.username LIKE :search", { search: "%kan%" })
  .getMany();

// 方式2:显式分组OR条件,适合更复杂的场景
const users = await userRepository.createQueryBuilder("user")
  .where("user.age = :age1", { age1: 20 })
  .orWhere("user.age = :age2", { age2: 22 })
  .orWhere("user.age = :age3", { age3: 23 })
  .andWhere(qb => qb.where("user.name LIKE :search", { search: "%kan%" })
                    .orWhere("user.username LIKE :search", { search: "%kan%" }))
  .getMany();

这两种方式都能精准生成你需要的SQL语句,无需手动枚举6种条件组合,代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:16:12