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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:03:10