在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。
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); |