TypeORM的find/findOne方法是否支持传入字符串格式的where查询参数
TypeORM 的 find/findOne 方法本身不支持直接传入纯字符串作为整个 where 参数,不过可以通过以下三种方案实现你需要的查询需求:
方案1:使用 TypeORM 内置的
Raw运算符直接绑定数据库列名
无需修改实体定义,直接在查询时指定数据库实际的列名编写条件,示例代码如下:import { Raw } from 'typeorm'; // 业务查询逻辑 const existingClient = await Client.findOne({ where: { // 第一个参数写列名匹配条件,第二个参数传绑定值避免SQL注入 _email: Raw((columnAlias) => `email = :targetEmail`, { targetEmail: email }) } });方案2:使用 QueryBuilder 编写自定义查询条件
更灵活的写法,完全支持直接写字符串格式的查询条件:const existingClient = await Client .createQueryBuilder('client') // 直接使用数据库列名编写条件,通过参数绑定传值 .where('email = :targetEmail', { targetEmail: 'testing@email.com' }) .getOne();方案3:给实体添加公开访问器(最符合TypeORM设计规范的方案)
给私有属性添加get/set访问器,之后就可以直接用访问器名称作为查询参数:
实体修改示例:import { Column, Entity, BaseEntity } from 'typeorm'; @Entity() export default class Client extends BaseEntity{ @Column({ name: 'email', type: 'varchar', length: 64, unique: true }) private _email: string; // 添加公开访问器 get email(): string { return this._email; } set email(value: string) { this._email = value; } }之后查询可以直接写:
const existingClient = await Client.findOne({ where: { email: email } });
注意:所有自定义SQL条件的场景都不要直接拼接用户输入的内容到SQL字符串中,必须用参数绑定的方式传值,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Henrique Assis
相关产品推荐
相关产品推荐

