天天看點

Spring-data-jpa 的@modifying注解

在項目的進行中需要通過 @Modifying 注解完成修改操作(注意:不支援新增)

1.之前有一個業務需要先查詢一個結果集,然後将滿足結果集中某個條件的另外一張表中的字段做一個屬性值的更改,這個更改可能是多個的

代碼如下

Spring-data-jpa 的@modifying注解

2.SQL語句如下

Spring-data-jpa 的@modifying注解

3.但是執行的過程中,控制台報錯,如下

Spring-data-jpa 的@modifying注解

 Can not issue data manipulation statements with executeQuery().

4.後來發現沒有添加  @Modifying注解

5.聊一聊@Modifying注解的實際使用

例如一下測試

@Modifying @Query("update Person set email = :email where lastName =:lastName")

void updatePersonEmailByLastName(@Param("lastName")String lastName,@Param("email")String email);

執行報錯,異常如下,

關鍵看這行 <code>Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query</code>,說明我們缺少事務配置。

可以在service實作類上面添加事物注解,也可以在方法上面添加事物注解,或者在xml 檔案中添加service事物控制器的管理

@Service 

@Transactional

&lt;context:component-scan base-package="com.liwei.springdata.service"&gt;&lt;/context:component-scan&gt;

總結如下

(1)可以通過自定義的 JPQL 完成 UPDATE 和 DELETE 操作。 注意: JPQL 不支援使用 INSERT; 

(2)在 @Query 注解中編寫 JPQL 語句, 但必須使用 @Modifying 進行修飾. 以通知 SpringData, 這是一個 UPDATE 或 DELETE 操作 

(3)UPDATE 或 DELETE 操作需要使用事務,此時需要定義 Service 層,在 Service 層的方法上添加事務操作; 

(4)預設情況下, SpringData 的每個方法上有事務, 但都是一個隻讀事務。 他們不能完成修改操作。