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

如何使用TypeORM QueryBuilder重写该findOne查询语句

TypeORM QueryBuilder 实现多条件OR匹配单条记录

原逻辑说明

原findOne查询的匹配规则为两个条件组满足任意一个即可:

  1. field1 = input1 且 field2 = input2
  2. field1 = input2 且 field2 = input1
    最终返回匹配到的第一条记录,无匹配结果时返回null。

等价QueryBuilder实现

需要引入TypeORM的Brackets类包裹每一组独立的AND条件,避免SQL运算符优先级导致逻辑错误,同时使用参数绑定规避SQL注入风险:

import { Brackets } from 'typeorm';

const data = await this.dataRepository
  .createQueryBuilder('data') // data为自定义表别名,可按需修改
  .where(
    new Brackets(qb => {
      qb.where('data.field1 = :input1', { input1 })
        .andWhere('data.field2 = :input2', { input2 })
    })
  )
  .orWhere(
    new Brackets(qb => {
      qb.where('data.field1 = :input2', { input2 })
        .andWhere('data.field2 = :input1', { input1 })
    })
  )
  .getOne();

上述代码最终生成的SQL逻辑等价于:

SELECT * FROM 你的表名 
WHERE (field1 = ? AND field2 = ?) 
   OR (field1 = ? AND field2 = ?)
LIMIT 1

关键注意点

  • 不要省略Brackets包裹:如果后续需要追加全局公共过滤条件(例如软删除字段过滤data.isDeleted = 0),不加括号会导致OR条件优先级错乱,返回不符合预期的结果。
  • 末尾调用的getOne()方法和原findOne行为完全一致:匹配到多条记录时按数据库默认排序返回第一条,无匹配时返回null。
  • 所有传入参数通过:参数名的命名占位符绑定,不要直接拼接变量到SQL字符串中,避免SQL注入漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:57:17