2013-07-12 5 views
28

Ich erhalte den Fehler Not supported for DML operations, wenn ich die folgende HQL verwenden ...mit einfachen UPDATE-Abfrage „Nicht für DML-Operationen unterstützt“

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

Was das Problem verursachen könnte? Aufgrund der wenigen Ergebnisse, die ich in Google gefunden habe, scheint dies kein allgemeiner Fehler zu sein.

+0

Vollständige Stacktrace? – kan

+0

können Sie Code vollständige Auflistung und die Stack-Trace bereitstellen. –

+0

Schauen Sie sich die akzeptierte Lösung http://StackOverflow.com/A/12426144/172306 sieht ähnlich aus. –

Antwort

37

Überprüfen Sie die Post hibernate hql ERROR: Not supported for DML operations im Winterschlaf Benutzer Forum.

Wahrscheinlich genannt Sie

querySt.list(); 

für Ihre UPDATE Abfrage. Stattdessen sollten Sie

querySt.executeUpdate(); 
+42

fragen ich 'benötigt @ Modifizieren' - Danke !! – Webnet

+2

Ich löse nur das gleiche Problem, indem ich die Annotation Modifying hinzufüge. Ein weiterer Hinweis: Der Rückgabetyp der Funktion muss ungültig sein, da ich die Funktion von einer normalen Abfragefunktion kopiert habe, so dass der Rückgabetyp List war, dann habe ich denselben Fehler, auch nachdem ich Modifying annotation hinzugefügt habe. – cn123h

+0

@ cn123h hatte das gleiche Problem, Kopie Paste hatte den Rückgabetyp als Liste statt void –

0

Das gleiche passierte mir nennen, weil, q ist ein Objekt der Klasse Query q.list() ist nicht für Updates verwendet werden soll oder löscht, aber q.executeUpdate()

0

Stellen Sie sicher, dass Ihre Serviceklassenmethode, die updateLastActivity aufruft, @Transactional(org.springframework.transaction.annotation.Transactional) Annotation hat. und ändern Sie die Repository-Methode unten,

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

Weitere Erkenntnisse nutzen Sie bitte this answer.

1

Ich hatte auch das gleiche Problem mit Annotationen.Nach der Suche und ein paar Tricks konnte ich es lösen. Es gibt einige Schritte, die Sie bei der Verwendung von DML mit JPA überprüfen müssen.

  1. Verwenden @Modifying den Vermerk (org.springframework.data.jpa.repository.Modifying) und @Transactional (org.springframework.transaction.annotation.Transactional) auf gewünschte Methode.

  2. Verwenden Sie void als Rückgabetyp der Methode.

zB: -

@Modifying

@Query ("UPDATE ProcedureDTO o SET o.isSelectedByUser = 1?")

@Transactional

public void getListOfProcedureBasedOnSelection (Boolean isSelected);

Verwandte Themen