当前位置: 首页 > 知识库问答 >
问题:

org.springframework.orm.hibernate4. HibernateQueryException:不支持DML操作[更新]

严修德
2023-03-14

我正在尝试更新数据库中的记录,但收到此错误

org.springframework.orm.hibernate4.HibernateQueryException: Not supported for DML operations [UPDATE com.xxx.models.User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false]; nested exception is org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [UPDATE com.xxx.models.User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false]

这是我的hql尝试

@Modifying
    public User updateUser(String emailAccess) {

        String hql = "UPDATE User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false";
        return (User) _sessionFactory.getCurrentSession().createQuery(hql).setParameter("emailAccess", emailAccess).list();

    }

经过研究,我在方法的顶部添加了@修改注释,但错误仍然存在。请问怎么了?

共有2个答案

程举
2023-03-14

当您要更新或删除实体时,应该在查询中调用executeUpdate()。

您使用的方法是通过给定的查询选择实体,而不是更新它们。

您的方法签名和返回类型不正确。您永远无法确定更新操作实际上只会更新特定用户executeUpdate()方法返回受查询影响的行数,而不是更新的实体。

此外,即使原始答案中的列表也不会返回特定用户。它(在选择查询的情况下)将根据您的条件返回用户列表。

韩飞翮
2023-03-14

修改是一个Spring数据注释,您似乎没有使用Spring数据,因此对您没有任何用处。

您需要调用executeUpdate(),并使返回方法作为executeUpdate无效

返回:更新或删除的实体数。。

https://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Query.html#executeUpdate()

或者返回第二个查询的结果。

public void updateUser(String emailAccess) {

    String hql = "UPDATE User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false";
    _sessionFactory.getCurrentSession().createQuery(hql).setParameter("emailAccess", emailAccess).executeUpdate();

}
 类似资料:
  • 作为测试的一部分,我一直在尝试创建一个用户,然后将其删除,但我不断收到相同的错误组织。冬眠hql。内部的QueryExecutionRequestException:即使在我的存储库和控制器中不断更改代码之后,DML操作也不受支持。 这是我的存储库中的代码: 这是我的控制器中的代码:

  • 这以前被问过一次,但解决方案并没有解决问题。我正在创建一个JUnit测试: 上述测试调用的查询是: 错误:

  • 我在springdatajpa中执行更新查询时遇到问题。这是存储库层中的代码: 如您所见,我已经添加了@修改注释,但它仍然抛出“不支持DML操作”的错误,我正在使用Hibernate 5.4。非常感谢任何帮助。

  • 问题内容: 我写了一个查询来删除我的扩展接口中的某些对象,但是当我执行查询时,它会抛出异常!谁能为我解释一下? 查询: 我收到了此错误,请问,请为我解释一下,谢谢大家:) 例外: 问题答案: 尝试这个: 每当您尝试修改db中的记录时,都必须将其标记为@Transactional和@Modifying,这将指示Spring可以修改现有记录。 存储库方法必须为空,否则将不断抛出异常。

  • 我已经编写了一个查询来删除扩展接口中的一些对象,但是当我执行查询时,它会抛出一个异常!谁能给我解释一下吗? 查询: 我犯了这个错误,请任何人帮我解释一下,谢谢大家:) 例外情况:

  • 当我使用以下HQL时,我得到了DML操作不支持的错误