2016-10-04 47 views
0

我试图更新数据库中的记录,我得到这个错误org.springframework.orm.hibernate4.HibernateQueryException:不支持DML操作[更新]

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注释,但错误仍然存​​在。请问有什么可能是错的?

+0

在你的return语句中我看到** .list()**并且你只返回一个用户。这是对的吗? – duardito

+0

使用'executeUpdate()'而不是'list' 同一问题在这里: http://stackoverflow.com/questions/17622147/not-supported-for-dml-operations-with-simple-update-query – seiya

回答

0

@Modifying是一个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(); 

} 
+0

无法投射从int到User。关于您的解决方案 – Francis

+0

由于API文档状态executeUpdate()返回更新或删除的实体的数量,因此是int而不是用户。 –

+0

究竟是什么遗漏? –

0

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

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

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

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