如何使用TypeORM QueryBuilder重写该findOne查询语句
TypeORM QueryBuilder 实现多条件OR匹配单条记录
原逻辑说明
原findOne查询的匹配规则为两个条件组满足任意一个即可:
field1 = input1且field2 = input2field1 = 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
相关产品推荐
相关产品推荐

