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

Spring Boot调用原生update查询数据不生效,如何正确编写相关代码?

不生效原因&修正方案

核心问题点

  • 参数绑定错误:REPLACE函数中你给:text包裹了单引号,导致Spring Data JPA将其识别为固定字符串':text',不会替换为你传入的参数,自然不会产生预期的修改效果
  • 事务缺失:所有修改类的JPA原生查询,必须在事务环境下执行才会提交到数据库,你当前的方法没有加事务注解
  • 模糊匹配规则不符合预期:当前WHERE条件name ILIKE :text只能匹配name和传入参数完全一致的记录,如果需要匹配包含该参数的所有记录,需要补充通配符%
  • 缓存未清空(可选):如果同一个事务内更新后立即查询,会命中JPA一级缓存拿到旧数据,需要配置清空持久化上下文

修正后代码

import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface SiteListRepository extends BaseListRepository<SiteList, Long> {

    // clearAutomatically配置按需开启,仅当同事务内需要查询更新后的数据时加
    @Modifying(clearAutomatically = true)
    @Transactional
    @Query(value = "UPDATE site_list SET name = REPLACE(name,:text,'') WHERE name ILIKE CONCAT('%', :text, '%')", nativeQuery = true)
    void updateSiteListName(@Param("text") String text);
}

说明

  1. 如果你需要精确匹配name等于传入参数的记录,保留原WHERE条件name ILIKE :text即可,不需要加CONCAT和百分号
  2. @Transactional注解也可以加在调用该方法的业务层方法上,不需要重复添加避免事务属性冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:36:03