Spring|Spring Date JPA 更新部分字段
【Spring|Spring Date JPA 更新部分字段】在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);
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- spring|spring boot项目启动websocket
- Spring|Spring Boot 整合 Activiti6.0.0
- Spring集成|Spring集成 Mina
- springboot使用redis缓存
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- Spring|Spring Boot之ImportSelector