TypeORM中如何用QueryBuilder实现WHERE NOT EXISTS子句?
在TypeORM中实现WHERE NOT EXISTS的几种方案
不用完全依赖原生查询,有两种可靠的方式实现:
1. 使用TypeORM的表达式API(Not + Exists)
TypeORM的表达式系统支持用Not包裹Exists对象来生成NOT EXISTS子句,示例如下:
import { Not, Exists, getRepository } from "typeorm"; import { User } from "./entities/User"; import { Order } from "./entities/Order"; const usersWithoutOrders = await getRepository(User) .createQueryBuilder("user") .where(new Not( new Exists( // 构造子查询的SQL字符串 getRepository(Order) .createQueryBuilder("order") .select("1") .where("order.userId = user.id") .getQuery() ) )) .getMany();
这段代码会生成类似这样的Postgres查询:
SELECT "user"."id" AS "user_id", "user"."name" AS "user_name" FROM "user" "user" WHERE NOT EXISTS (SELECT 1 FROM "order" "order" WHERE "order"."userId" = "user"."id")
2. 在where()中直接嵌入带参数绑定的原生片段
如果子查询逻辑复杂,直接写原生的NOT EXISTS片段更直观,注意用参数绑定避免SQL注入:
const targetStatus = "completed"; const usersWithoutCompletedOrders = await getRepository(User) .createQueryBuilder("user") .where(`NOT EXISTS ( SELECT 1 FROM "order" "order" WHERE "order"."userId" = "user"."id" AND "order"."status" = :status )`, { status: targetStatus }) .getMany();
为什么NotBrackets不适用?
NotBrackets的作用是给普通条件组添加否定(比如NOT (a = 1 AND b = 2)),它并不支持直接关联exists类方法,所以不能用来实现NOT EXISTS。
内容的提问来源于stack exchange,提问作者billshortz
相关产品推荐
相关产品推荐

