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

时间:2016-10-04 18:01:56

标签: java spring hibernate hql

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

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注释添加到方法的顶部,但错误仍然存​​在。请问有什么不对?

2 个答案:

答案 0 :(得分:0)

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

您正在使用的

list()方法是按给定查询选择实体,而不是更新它们。

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

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

答案 1 :(得分:0)

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

您需要调用executeUpdate()并将return方法设为void,如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();

}