Springboot JPA update语句的返回值

本文探讨了如何在使用Hibernate+JPA进行update操作时,正确获取实际被修改的数据行数。解决方案包括全局配置数据库参数和调整SQL语句。通过实例代码展示了两种方法并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在使用Hibernate + JPA做update,希望使用JPA的返回值看到一共有多少条数据被修改,我使用了如下代码进行操作:

持久层代码:

  @Modifying(clearAutomatically=true, flushAutomatically = true)
  @Transactional
  @Query(value = "UPDATE users set enabled = :enabled WHERE id IN :ids", nativeQuery = true)
  int batchUpdateUserEnableStatus(@Param("ids") List<Long> ids, @Param("enabled") boolean enabled);

Service层代码:

System.out.println(userRepo.batchUpdateUserEnableStatus(Arrays.asList(1L, 2L, 3L), false));

但当我以一组id作为参数传入时,发现它的返回值是在DB中根据where语句找到的数据行数而非真实修改的数据行数。在上面的例子中,由于这组id中已经有部分的enabled状态已经为false,我只想得到真正修改了多少行数据,怎么办呢?

经过多方查找,找到了2种解决方案:

第一种:全局配置修改,在mysql配置中增加一个参数 useAffectedRows=true

如:

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=yes&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true&useAffectedRows=true
spring.datasource.username=root
spring.datasource.password=123456

第二种:修改SQL,增加where条件

  @Modifying(clearAutomatically=true, flushAutomatically = true)
  @Transactional
  @Query(value = "UPDATE users set enabled = :enabled WHERE id IN :ids AND enabled != :enabled", nativeQuery = true)
  int batchUpdateUserEnableStatus(@Param("ids") List<Long> ids, @Param("enabled") boolean enabled);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值