【问题标题】:"Not supported for DML operations" with simple UPDATE query带有简单 UPDATE 查询的“不支持 DML 操作”
【发布时间】:2013-07-11 10:09:18
【问题描述】:

我在使用以下 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 中找到的少数结果,这似乎不是一个常见错误。

【问题讨论】:

  • 能否提供代码完整列表和堆栈跟踪。
  • 看看这个stackoverflow.com/a/12426144/172306接受的解决方案看起来很相似。
  • +1 for "@Modifying"(来自您自己对 Ajay Bhojak 的回答中的评论)您应该将此添加为默认答案,因为这应该是 Spring JPA Repository 问题,您在质疑

标签: java sql hibernate spring-mvc hql


【解决方案1】:

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

你很可能打过电话

querySt.list();

为您的UPDATE 查询。相反,您应该调用

querySt.executeUpdate();

【讨论】:

  • 我只是通过添加修改注释来解决同样的问题。再提示:函数返回类型必须为void,因为我从普通查询函数中复制了该函数,所以返回类型是List,然后即使添加了Modifying annotation,我也有同样的错误。
  • @cn123h 也有同样的问题,复制粘贴的返回类型为 List 而不是 void
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      同样的事情发生在我身上,因为作为 q 类 Query 的对象,q.list() 不能用于更新或删除,而是 q.executeUpdate()

      【讨论】:

        【解决方案5】:

        确保调用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

        【讨论】:

          猜你喜欢
          • 2021-09-28
          • 2015-10-08
          • 2016-07-28
          • 2018-07-23
          • 2019-02-01
          • 1970-01-01
          • 2022-10-25
          • 2019-05-03
          • 1970-01-01
          相关资源
          最近更新 更多