使用简单的UPDATE查询“不支持DML操作”

时间:2013-07-12 18:58:19

标签: java sql hibernate spring-mvc hql

当我使用以下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);

可能导致此问题的原因是什么?鉴于我在谷歌发现的结果很少,这似乎不是一个常见的错误。

5 个答案:

答案 0 :(得分:37)

检查hibernate用户论坛中的帖子hibernate hql ERROR: Not supported for DML operations

很可能你打电话了

querySt.list();

用于UPDATE查询。相反,你应该打电话给

querySt.executeUpdate();

答案 1 :(得分:1)

我也有同样的注释问题。经过搜索和做一些技巧,我能够解决它。 在使用JPA的DML操作时,您需要验证以下一些步骤。

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

  2. 使用void作为返回类型的方法。

  3. 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