1. 程式人生 > >解決問題:Spring Date JPA 更新部分欄位

解決問題: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);