35

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

什么可能导致问题?鉴于我在 Google 中找到的少数结果,这似乎不是一个常见的错误。

4

5 回答 5

39

检查帖子hibernate hql ERROR: Not supported for DML operations in the hibernate users forum。

你很可能打电话给

querySt.list();

供您UPDATE查询。相反,你应该打电话

querySt.executeUpdate();
于 2013-07-30T09:36:49.980 回答
9

我在注释方面也遇到了同样的问题。在搜索并做了一些技巧之后,我能够解决它。在将 DML 操作与 JPA 一起使用时,您需要验证以下一些步骤。

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

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

例如:-

@Modifying
@Query("UPDATE ProcedureDTO o SET o.isSelectedByUser =?1")
@Transactional
public void getListOfProcedureBasedOnSelection(Boolean isSelected);```
于 2017-12-28T12:06:57.830 回答
1

我有完全相同的问题,在我的情况下,我只需要添加@Modifying注释。根据文档:

表示查询方法应被视为修改查询,因为这会改变它需要执行的方式。仅当用于通过 Query 注释定义的查询方法时才考虑此注释。它不适用于自定义实现方法或从方法名称派生的查询,因为它们已经控制了基础数据访问 API 或指定它们是否通过其名称进行修改。需要@Modifying注释的查询包括 INSERT、UPDATE、DELETE 和 DDL 语句。

于 2021-03-10T23:18:47.913 回答
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);

有关更多见解,请使用此答案

于 2017-11-02T01:38:42.103 回答
0

我也遇到了同样的情况,因为作为 q 类 Query 的对象,q.list() 不能用于更新或删除,而是 q.executeUpdate()

于 2015-08-11T12:43:18.110 回答