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。java

1
2
3
4
5
6
7
8
9
@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);
相关文章
相关标签/搜索