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); }
说明
- 如果你需要精确匹配name等于传入参数的记录,保留原WHERE条件
name ILIKE :text即可,不需要加CONCAT和百分号 @Transactional注解也可以加在调用该方法的业务层方法上,不需要重复添加避免事务属性冲突
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

