2013-07-12 55 views
28

,我發現了錯誤Not supported for DML operations當我用下面的HQL ...「不支持DML操作」用簡單的UPDATE查詢

@Query("UPDATE WorkstationEntity w SET w.lastActivity = :timestamp WHERE w.uuid = :uuid") 
void updateLastActivity(@Param("uuid") String uuid, @Param("timestamp") Timestamp timestamp); 

什麼引起的問題?考慮到我在Google中找到的少數結果,這似乎不是一個常見的錯誤。

+0

Full stacktrace? – kan

+0

你可以提供代碼完整列表和堆棧跟蹤。 –

+0

看看這個公認的解決方案http://stackoverflow.com/a/12426144/172306看起來類似。 –

回答

37

查看hibernate用戶論壇中的帖子hibernate hql ERROR: Not supported for DML operations

最有可能您的UPDATE查詢稱爲

querySt.list(); 

。相反,你應該叫

querySt.executeUpdate(); 
+42

我需要'@修改 - - 謝謝! – Webnet

+2

我只是通過添加Modifying註釋來解決同樣的問題。還有一個提示:函數返回類型必須是無效的,因爲我從普通查詢函數中複製了函數,所以返回類型爲List ,即使添加了Modifying註解之後,我也有同樣的錯誤。 – cn123h

+0

@ cn123h有同樣的問題,複製粘貼的返回類型爲List 而不是void –

0

同樣發生在我身上,因爲作爲Q類查詢的對象,q.list()不能被用於更新或刪除,但q.executeUpdate()

0

確保您調用updateLastActivity的服務等級方法具有@Transactional(org.springframework.transaction.annotation.Transactional)註釋。和修改存儲庫的方法如下,

import org.springframework.data.jpa.repository.Modifying; 
import org.springframework.data.jpa.repository.Query; 
... 
@Modifying 
@Query("UPDATE WorkstationEntity w SET w.lastActivity = :timestamp WHERE w.uuid = :uuid") 
void updateLastActivity(@Param("uuid") String uuid, @Param("timestamp") Timestamp timestamp); 

更多的見解,請使用this answer

1

我也有註釋相同的問題。經過搜索和做一些技巧,我能夠解決它。 在使用JPA使用DML操作時,需要驗證以下幾個步驟。

  1. 使用anotation上所需的方法 @Modifying(org.springframework.data.jpa.repository.Modifying)和@Transactional(org.springframework.transaction.annotation.Transactional)。

  2. 使用void作爲方法的返回類型。

例如: -

@Modifying

@Query( 「UPDATE ProcedureDTO O設定o.isSelectedByUser = 1?」)

@Transactional

公共無效getListOfProcedureBasedOnSelection(布爾isSelected);

相關問題