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();
}
我正在尝试更新数据库中的记录,但出现此错误
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();
}