Je reçois l'erreur Not supported for DML operations
lorsque j'utilise le HQL suivant ...
@Query("UPDATE WorkstationEntity w SET w.lastActivity = :timestamp WHERE w.uuid = :uuid")
void updateLastActivity(@Param("uuid") String uuid, @Param("timestamp") Timestamp timestamp);
Quelle pourrait être la cause du problème? Cela ne semble pas être une erreur courante compte tenu des quelques résultats que j'ai trouvés dans Google.
Vérifiez la publication hibernate hql ERROR: Not supported for DML operations in the hibernate users forum.
Vous avez probablement appelé
querySt.list();
pour votre requête UPDATE
. Au lieu de cela, vous devez appeler
querySt.executeUpdate();
J'avais aussi le même problème avec les annotations. Après avoir cherché et fait quelques astuces, j'ai pu le résoudre. Il y a quelques étapes ci-dessous que vous devez vérifier lors de l'utilisation de l'opération DML avec JPA.
Utilisez une annotation @Modifying (org.springframework.data.jpa.repository.Modifying) et @Transactional (org.springframework.transaction.annotation.Transactional) sur la méthode requise.
Utilisez void comme type de méthode de retour.
par exemple:-
@Modifier
@Query ("UPDATE ProcedureDTO o SET o.isSelectedByUser =? 1")
@Transactional
public void getListOfProcedureBasedOnSelection (Boolean isSelected);
Assurez-vous que votre méthode de classe de service qui appelle updateLastActivity
a l'annotation @Transactional(org.springframework.transaction.annotation.Transactional)
. et modifiez la méthode du référentiel ci-dessous,
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);
Pour plus d'informations, veuillez utiliser cette réponse .
La même chose m'est arrivée car, étant q un objet de la classe Query, q.list () ne doit pas être utilisé pour les mises à jour ou les suppressions, mais q.executeUpdate ()