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