HQL表达式中的java Null
我想知道HQL表达式是否是空安全的? 例如,考虑这个命名查询
SELECT a
FROM A a
where a.f=:f
其中f是字符串、双精度、日期等类型的字段。 然后我使用它,就像:
session.getNamedQuery("myNamedQuery").setString("f", myFValue).uniqueResult();
如果a.f和myFValue都为null,我希望条件为true,如果其中只有一个为null,我希望条件为false
如果它不是空安全的,我如何处理它
问候
# 1 楼答案
你应该使用
is null
或is not null
。 见HQL "is null" And "!= null" on an Oracle column# 2 楼答案
它们不是零安全的。使用这些标准就可以做到这一点
# 3 楼答案
事实并非如此。尝试以下场景来处理您的具体案例:
select a from A a where ((:f is null and a.f is null) or a.f = :f) and ...
如果参数字符串为null,那么查询将检查行的状态是否也为null。否则,它将求助于与等号进行比较
如果需要跳过:status where_子句;您可以这样编写代码:
select a from A a where (:f is null or a.f = :f) and ...
第二个查询相当于:
# 4 楼答案
不,它们不安全。它们被直接转换为SQL,并遵循相同的规则。所以如果你想测试null,你必须使用
is [not] null
因此,如果f参数可以为null,则必须使用两个不同的HQL查询,或者动态地构建它,或者使用条件查询来构建动态查询
# 5 楼答案
它们不是空安全的
HQL将HQL查询转换为SQL,然后替换参数。所以它不会重写param=?to param为空
选择Criteria API并使用
Restrictions.isNull("f");