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