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
相关产品推荐
相关产品推荐

