如何在PostgreSQL的updateAll中添加自定义查询条件
解决方案
你当前的写法错误在于将原生SQL字符串直接作为updateAll的条件对象键,该方法的第一个参数要求是与实体属性匹配的条件结构,无法直接识别原生SQL片段。以下两种方案可实现自定义查询逻辑:
方案1:使用QueryBuilder(推荐,灵活性最高)
通过QueryBuilder可以直接编写原生SQL条件,完全支持自定义查询逻辑:
const result = await this.sampleRequestsRepository .createQueryBuilder() .update() .set({ deletedAt: true }) // 修正原代码拼写错误:deleatedAt → deletedAt .where(`created BETWEEN NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER -7 AND NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER`) .execute(); console.log(result);
方案2:使用Raw函数适配updateAll参数
若坚持使用updateAll,可借助TypeORM提供的Raw函数包裹原生SQL条件,让框架正确解析:
首先导入Raw工具:
import { Raw } from "typeorm";
然后修改调用逻辑:
const result = await this.sampleRequestsRepository.updateAll( { created: Raw(alias => `${alias} BETWEEN NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER -7 AND NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER`) }, { deletedAt: true } // 修正拼写错误 ); console.log(result);
注意事项
- 原代码中的
deleatedAt是拼写错误,正确字段名应为deletedAt,否则更新操作无法匹配目标字段。 - 使用
Raw时,alias参数会自动映射为实体对应的数据库列名(若实体字段与列名一致则直接使用字段名),避免硬编码列名导致的适配问题。
内容的提问来源于stack exchange,提问作者rithuwa
相关产品推荐
相关产品推荐

