解決問題:Spring Date JPA 更新部分欄位
阿新 • • 發佈:2019-01-29
在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);