【问题标题】:How to put 'null' into column using HQL?如何使用 HQL 将“null”放入列中?
【发布时间】:2010-11-18 11:14:21
【问题描述】:

如何构建有效的HQL字符串,相当于

UPDATE table SET field = null WHERE ....

【问题讨论】:

  • 可能是一个愚蠢的问题,但是,这个 sql 更新是否可以从一些 sql 控制台工作?即,您是否对列“字段”有一个约束 NOT NULL?
  • sql 没问题 - 它可以从控制台正常工作!

标签: java hibernate hql


【解决方案1】:

您是指批量 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 并正常持久化实体。

【讨论】:

  • 谢谢,但是......两个版本都会抛出 HibernateException !!! setString("param", myValue) executeUpdate();仅当 myValue 不为 null 时才有效!!!
  • 什么样的HibernateException(错误说明了什么)?您的表是否允许在该列中使用 NULL?该属性实际上是字符串还是其他类型?
  • 1.表列允许 NULL 2. 属性实际上是字符串(与“日期”类型的列相同的问题) 2。不幸的是,休眠异常错误无效(“对象上缺少更新权限.....)。不正确:如果 myValue 是空字符串或非空值 - 请求的列会毫无问题地更新
  • 您能否更新您的问题并发布 1) hibernate 异常的完整堆栈跟踪和 2) hibernate 生成的 SQL(如果您还没有将 hibernate.show_sql 属性设置为 true,则可能需要)。我之前使用批量更新将值设置为 NULL 并且它没有问题 - 问题在于您的设置,而不是 Hibernate 本身。
  • 请注意,像这样设置 null 将起作用setParameter("param", myValue)。 Hibernate 将无法找出正确的类型。使用 setString 可能会起作用。但也可以传递第三个参数setParameter("param", myValue, myType)
【解决方案2】:

为什么你的更新语句需要在 HQL 中完成?您是否将此表映射到系统中的实体?如果这样做,那么您只需将映射到该列的属性设置为 null,然后对该实体运行保存。例如。

myObject.setMyProperty(null); getSessionFactory().getCurrentSession().save(myObject);

这应该对你有用,但你必须有一个实体映射到有问题的表。

【讨论】:

  • 这会明显变慢并且使批量更新查询的概念失效。
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2011-11-05
  • 2015-09-17
  • 1970-01-01
  • 2020-01-16
  • 2011-04-12
  • 2022-09-24
相关资源
最近更新 更多