当我使用以下HQL时,我收到错误Not supported for DML operations
@Query("UPDATE WorkstationEntity w SET w.lastActivity = :timestamp WHERE w.uuid = :uuid")
void updateLastActivity(@Param("uuid") String uuid, @Param("timestamp") Timestamp timestamp);
可能导致此问题的原因是什么?鉴于我在谷歌发现的结果很少,这似乎不是一个常见的错误。
答案 0 :(得分:37)
检查hibernate用户论坛中的帖子hibernate hql ERROR: Not supported for DML operations。
很可能你打电话了
querySt.list();
用于UPDATE
查询。相反,你应该打电话给
querySt.executeUpdate();
答案 1 :(得分:1)
我也有同样的注释问题。经过搜索和做一些技巧,我能够解决它。 在使用JPA的DML操作时,您需要验证以下一些步骤。
使用anotation @Modifying(org.springframework.data.jpa.repository.Modifying)和@Transactional(org.springframework.transaction.annotation.Transactional)所需的方法。
使用void作为返回类型的方法。
e.g: -
@Modifying
@Query(“UPDATE ProcedureDTO o SET o.isSelectedByUser =?1”)
@Transactional
public void getListOfProcedureBasedOnSelection(Boolean isSelected);
答案 2 :(得分:1)
我遇到了完全相同的问题,就我而言,我只需要添加 @Modifying
注释。根据文档:
表示一个查询方法应该被视为修改查询,因为它改变了它需要执行的方式。仅当用于通过 Query 注释定义的查询方法时才考虑此注释。它不适用于自定义实现方法或从方法名称派生的查询,因为它们已经可以控制底层数据访问 API 或指定它们是否通过名称进行修改。
需要 @Modifying
注释的查询包括 INSERT、UPDATE、DELETE 和 DDL 语句。
答案 3 :(得分:0)
同样的事情发生在我身上,因为q是一个Query类的对象,q.list()不能用于更新或删除,而是q.executeUpdate()
答案 4 :(得分: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。