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

TypeORM中动态添加andWhere子句时的语法错误问题

解决TypeORM QueryBuilder动态添加WHERE子句的语法错误

你的代码存在两个核心问题导致了语法错误,以下是具体修正方案:

问题分析与修复

1. 参数对象未使用计算属性名

原代码中{varname: '%{searchVal}%'}的写法有误——这里的varname是字面量字符串,并非循环中生成的变量值(比如searchVal1)。TypeORM无法匹配SQL语句中的:searchVal1参数,导致SQL里保留了未替换的:searchVal1,触发语法错误。

必须使用计算属性名将变量varname作为参数对象的键,正确写法为{ [varname]: ... }。

2. 模糊匹配字符串模板语法错误

原代码里的%{searchVal%存在语法错误,应该写成%${searchVal}%,确保变量正确插入到模板字符串中。

额外修正:第一个WHERE条件的参数绑定

原代码中.where('myTable.id = :id', {table_id})的参数绑定错误,:id对应的参数键应为id,而非table_id,需要调整为{id: table_id}。

修正后的完整代码

const query = this.tableRepository.createQueryBuilder('myTable')
    .where('myTable.id = :id', { id: table_id }); // 修正参数键

let ind = 1;
for (const key in myObj) {
    const varname = `searchVal${ind}`;
    const searchVal = myObj[key];
    // 使用计算属性名,修正模糊匹配字符串
    query.andWhere(`row_value.row_data->> '${key}' ILIKE :${varname}`, {
        [varname]: `%${searchVal}%`
    });
    ind++;
}

可选优化:简化遍历逻辑

如果不需要手动维护索引,可以用Object.entries遍历键值对,代码更简洁:

const query = this.tableRepository.createQueryBuilder('myTable')
    .where('myTable.id = :id', { id: table_id });

Object.entries(myObj).forEach(([key, searchVal], index) => {
    const varname = `searchVal${index + 1}`;
    query.andWhere(`row_value.row_data->> '${key}' ILIKE :${varname}`, {
        [varname]: `%${searchVal}%`
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:07:37