2013-07-12 9 views
28

Dostaję błąd Not supported for DML operations kiedy należy stosować następujące HQL ...„Nie jest obsługiwany dla operacji DML” z zapytaniem prosty UPDATE

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

Co może być przyczyną problemu? Nie wydaje się być częstym błędem, biorąc pod uwagę kilka wyników, które znalazłem w Google.

+0

Pełny wskaźnik stacktrace? – kan

+0

możesz podać pełny listing kodu i ślad stosu. –

+0

Przyjrzyj się przyjętemu rozwiązaniu dla tego http://stackoverflow.com/a/12426144/172306 wygląda podobnie. –

Odpowiedz

37

Sprawdź wpis hibernate hql ERROR: Not supported for DML operations na forum użytkowników hibernacji.

Najprawdopodobniej nazywa

querySt.list(); 

dla zapytania UPDATE. Zamiast tego należy zadzwonić

querySt.executeUpdate(); 
+42

Potrzebowałem '@ Modyfikacja - dzięki! – Webnet

+2

Po prostu rozwiązuję ten sam problem, dodając adnotację modyfikującą. Jeszcze jedna podpowiedź: typ funkcji return musi być nieważny, ponieważ skopiowałem funkcję z normalnej funkcji zapytania, więc typem zwracanym była List , a następnie mam ten sam błąd nawet po dodaniu Adnotacji modyfikującej. – cn123h

+0

@ cn123h miał ten sam problem, kopiuj wklej miał typ zwrotu jako List zamiast pustego –

0

To samo przydarzyło się mnie, ponieważ, będąc q przedmiotem Query klasy q.list() nie może być używany do aktualizacji lub usuwa, ale q.executeUpdate()

0

Upewnij się, że twoja metoda klasy usług, która wywołuje updateLastActivity, ma adnotację @Transactional(org.springframework.transaction.annotation.Transactional). i zmodyfikować metodę repozytorium poniżej,

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

żeby uzyskać więcej informacji proszę skorzystać this answer.

1

Miałem też ten sam problem z adnotacjami. Po przeszukiwaniu i wykonaniu niektórych sztuczek udało mi się go rozwiązać. Poniżej znajduje się kilka kroków, które należy zweryfikować podczas korzystania z operacji DML przy użyciu JPA.

  1. Zastosowanie adnotację @Modifying (org.springframework.data.jpa.repository.Modifying) i @Transactional (org.springframework.transaction.annotation.Transactional) od wymaganego sposobu.

  2. Użyj pustki jako metody zwrotu.

np: -

@Modifying

@query ("UPDATE ProcedureDTO Ň o.isSelectedByUser = 1?")

@Transactional

public void (getListOfProcedureBasedOnSelection Boolean isSelected);

Powiązane problemy