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

