如何将Hibernate参数设置为"null"?示例:
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文档不会为查询返回任何记录.)
我的问题:
Hibernate不正确地将空字符串翻译成"is“(而且错误地创建了"= null”)?发布于 2010-01-24 09:49:09
param = ?重写到param is null。发布于 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
它相当于:
sql.append(" where ");
if(status != null){
sql.append(" c.status = :status and ");
}
sql.append(" c.type =:type ");发布于 2010-01-23 14:27:48
setParameter(String, Object)是显式的,表示对象值必须是非空的.遗憾的是,如果传入null,它不会抛出异常。
另一种选择是setParameter(String, Object, Type),它确实允许空值,尽管我不确定哪个Type参数在这里最合适。
https://stackoverflow.com/questions/2123438
复制相似问题