解决问题:Spring Date JPA 更新部分字段

版权声明:Soulmate_Min专属 https://blog.csdn.net/Soulmate_Min/article/details/82777293

在Spring Data JPA 中,新增和更新操作都是用save()的方式进行,JPA是通过什么方法来知道我们是要进行insert还是update呢?

经过测试,JPA对程序调用的save()方法判断是updata或者insert操作的依据是看实体对象的主键是否被赋值。

JPA首先会通过主键去查询数据库中是否已经有该ID,如果未查到,那么就执行insert方法,相反如果查到就会执行update方法。

关于更新部分字段:

JPA只能判断出是执行insert还是update,它不能判断出我们是否更新部分字段。所以没有被我们赋值的字段都会被覆盖为NULL。

由此,通过实体对象进行更新时不可取的。

JPA的更新字段的方法有两种:

1.通过设置主键进行save()保存。

使用save()方法更新字段一定要通过Repository获取实体对象,在此对象上进行更新操作。

2.通过注解@Query实现复杂的sql语句。

在执行update或者delete方法时,必须加上注解@Modifying 和 @Transactional。

更新部分数据操作例子:

@Modifying
@Transactional
@Query("update Test a set " +
       "a.name = CASE WHEN :#{#testAre.name} IS NULL THEN a.name ELSE :#{#testAre.name} END ," +
       "a.age = CASE WHEN :#{#testAre.age} IS NULL THEN a.age ELSE :#{#testAre.age} END ," +
       "a.insertTime = CASE WHEN :#{#testAre.insertTime} IS NULL THEN a.insertTime ELSE :#{#testAre.insertTime} END ," +
       "a.spare =  CASE WHEN :#{#testAre.spare} IS NULL THEN a.spare ELSE :#{#testAre.spare} END " +
       "where a.id = :#{#testAre.id}")
int update(@Param("testAre") TestAre testAre);

猜你喜欢

转载自blog.csdn.net/Soulmate_Min/article/details/82777293