我正在尝试更新数据库中的记录并收到此错误
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 :(得分: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();
}