【发布时间】:2010-11-18 11:14:21
【问题描述】:
如何构建有效的HQL字符串,相当于
UPDATE table SET field = null WHERE ....
【问题讨论】:
-
可能是一个愚蠢的问题,但是,这个 sql 更新是否可以从一些 sql 控制台工作?即,您是否对列“字段”有一个约束 NOT NULL?
-
sql 没问题 - 它可以从控制台正常工作!
如何构建有效的HQL字符串,相当于
UPDATE table SET field = null WHERE ....
【问题讨论】:
您是指批量 HQL 更新吗?试试这个
UPDATE myEntity e SET e.myProperty = null WHERE ...
你也可以使用上面的参数化版本
UPDATE myEntity e SET e.myProperty = :param WHERE ...
在您的代码中:
int updatedEntities = session.createQuery(updateQueryHQL)
.setString( "param", myValue ) // or .setString( "param", null )
.executeUpdate();
详情请见documentation。
如果您不进行批量更新,则应将属性设置为 NULL 并正常持久化实体。
【讨论】:
hibernate.show_sql 属性设置为 true,则可能需要)。我之前使用批量更新将值设置为 NULL 并且它没有问题 - 问题在于您的设置,而不是 Hibernate 本身。
setParameter("param", myValue)。 Hibernate 将无法找出正确的类型。使用 setString 可能会起作用。但也可以传递第三个参数setParameter("param", myValue, myType)。
为什么你的更新语句需要在 HQL 中完成?您是否将此表映射到系统中的实体?如果这样做,那么您只需将映射到该列的属性设置为 null,然后对该实体运行保存。例如。
myObject.setMyProperty(null); getSessionFactory().getCurrentSession().save(myObject);
这应该对你有用,但你必须有一个实体映射到有问题的表。
【讨论】: