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

