首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate:如何使用HQL设置空查询参数值?

问Hibernate:如何使用HQL设置空查询参数值?
EN

Stack Overflow用户
提问于 2010-01-23 14:21:00
回答 10查看 139.8K关注 0票数 62

如何将Hibernate参数设置为"null"?示例:

代码语言:javascript
复制
Query query = getSession().createQuery("from CountryDTO c where c.status = :status  and c.type =:type")
.setParameter("status", status, Hibernate.STRING)
.setParameter("type", type, Hibernate.STRING);

在我的例子中,状态字符串可以是空的。我对此进行了调试,然后hibernate生成了这样的SQL字符串/查询.status = null.但是,这在MYSQL中不起作用,因为正确的SQL语句必须是"status is null“(Mysql不理解status=null,并将其计算为false,以便根据我读过的mysql文档不会为查询返回任何记录.)

我的问题:

  1. 为什么Hibernate不正确地将空字符串翻译成"is“(而且错误地创建了"= null”)?
  2. 重写这个查询的最佳方法是什么,这样它才是空安全的?对于空安全,我的意思是在"status“字符串为空的情况下,它应该创建一个”should“吗?
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-01-24 09:49:09

  1. 我相信hibernate首先将您的HQL查询转换为SQL,然后它才尝试绑定您的参数。这意味着它无法将查询从param = ?重写到param is null。
  2. 尝试使用标准api: 标准c= session.createCriteria(CountryDTO.class);c.add(Restrictions.eq("type",type));c.add(状态== null?Restrictions.isNull(“状态”):Restrictions.eq(“状态”,状态);列表结果= c.list();
票数 40
EN

Stack Overflow用户

发布于 2014-02-06 02:50:56

这不是Hibernate特有的问题(这只是SQL性质),是的,SQL和HQL都有一个解决方案:

@彼得·朗有正确的想法,而你有正确的HQL查询。我想您只是需要一个新的干净运行来获取查询更改;-)

下面的代码绝对有效,如果您将所有查询都保存在orm.xml中是很好的

from CountryDTO c where ((:status is null and c.status is null) or c.status = :status) and c.type =:type

如果参数字符串为null,则查询将检查该行的状态是否为空。否则,它将诉诸与等号比较。

备注:

这个问题可能是一个特定的MySql怪癖。我只和甲骨文测试过。

以上查询假定存在c.status为空的表行。

where子句被排序,以便首先检查参数。

参数名'type‘在SQL中可能是一个保留字,但这不重要,因为它在查询运行之前被替换了。

如果您需要跳过: where_clause状态,您可以编写如下代码:

from CountryDTO c where (:status is null or c.status = :status) and c.type =:type

它相当于:

代码语言:javascript
复制
sql.append(" where ");
if(status != null){
  sql.append(" c.status = :status and ");
}
sql.append(" c.type =:type ");
票数 34
EN

Stack Overflow用户

发布于 2010-01-23 14:27:48

setParameter(String, Object)是显式的,表示对象值必须是非空的.遗憾的是,如果传入null,它不会抛出异常。

另一种选择是setParameter(String, Object, Type),它确实允许空值,尽管我不确定哪个Type参数在这里最合适。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2123438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档