spring jpa注解实现update操作,数据更新成功,但返回值为0

您所在的位置:网站首页 update影响行数 spring jpa注解实现update操作,数据更新成功,但返回值为0

spring jpa注解实现update操作,数据更新成功,但返回值为0

2023-08-27 19:23| 来源: 网络整理| 查看: 265

今日问题:

update成功但是返回值零,应该返回受影响条数,模拟如下

public int test(){ Optional userOpt = dao.findById(1); if(!userOpt.isPresent()) { return 0; } User user = userOpt.get(); user.setAge(12); user.setName("qiao8jiag"); return dao.userUpdate(user.getAge(), user.getName()); } public interface UserDao extends JpaRepository { @Modifying @Transactional @Query("update User u set u.age = ?1, u.name = ?2 where u.id = '1'") int userUpdate(int age, String name); }

打印日志发现,执行了两个update,第一个语句和repo.save()方法一样,第二个是我自己写的,所以在执行我的更新之前自动执行了一次update ,导致我自己sql没有对数据库进行更改。

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from user user0_ where user0_.id=? Hibernate: update user set age=?, name=? where id=? Hibernate: update user set age=?, name=? where id='1' 0

查询发现,hibernate有自动保存,如果对查询出来的结果直接进行set属性操作,在事务结束前,会自动对该实体进行一次保存。

解决方法:

避免对查询结果直接进行操作:将查询出来的结果通过 BeanUtils.copyProperties方法复制一个对象出来,然后对副本对象进行set属性操作,不更改原对象。 public int test(){ Optional userOpt = dao.findById(1); if(!userOpt.isPresent()) { return 0; } User user = new User(); BeanUtils.copyProperties(userOpt.get(), user); user.setAge(12); user.setName("dandan"); return dao.userUpdate(user.getAge(), user.getName()); } Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from user user0_ where user0_.id=? Hibernate: update user set age=?, name=? where id='1' 1 清除缓存(没有实践,待后补)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3