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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:24:04