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

org.springframework.orm.hibernate4.HibernateQueryException: Not supported for DML operations [UPDATE]

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

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

    }

研究后,我在方法的顶部添加了@Modifying注解,但错误仍然存​​在。请问有什么问题吗?

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

list() 您使用的方法是 select 给定查询的实体,而不是更新它们。

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

此外,即使 list() 来自您的原始答案,也不会 return 特定用户。它(在 select 查询的情况下)将 return 根据您的条件列出用户。

@Modifying 是一个 Spring 数据注释,您似乎没有使用 Spring 数据,因此这对您没有用。

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

Returns: The number of entities updated or deleted..

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

或return第二次查询的结果。

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

}