2

我想知道 HQL 表达式是否是空安全的?例如,考虑这个命名查询

SELECT a
FROM A a
where a.f=:f

其中 f 是 String、Double、Date 等类型的字段。然后我像这样使用它:

session.getNamedQuery("myNamedQuery").setString("f", myFValue).uniqueResult();

如果 af 和 myFValue 都为空,我希望条件为真,如果其中只有一个为空,我希望它为假。

如果它不是空安全的,我该如何处理?

问候

4

5 回答 5

1

他们不是。尝试这些场景来处理您的特定情况:

select a from A a where ((:f is null and a.f is null) or a.f = :f) and ...

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

如果您需要完全跳过 :status where_clause;你可以这样编码:

select a from A a where (:f is null or a.f = :f) and ...

第二个查询相当于:

if(status != null){
  sql.append(" a.f = :f and ");
}
于 2014-02-06T03:10:53.887 回答
1

不,它们不是空安全的。它们直接转换为 SQL,并遵守相同的规则。所以如果你想测试 null,你必须使用is [not] null.

因此,如果 f 参数可以为 null,则您必须使用两个不同的 HQL 查询,或者动态构建它,或者使用 Criteria 查询来构建动态查询。

于 2013-06-10T06:58:06.903 回答
0

它们不是空安全的。使用标准可以解决问题

public static void addNullSafeEqualsRestriction(Criteria criteria, String propertyName, Object object) {
    if (object == null) {
        criteria.add(Restrictions.isNull(propertyName));
    } else {
        criteria.add(Restrictions.eq(propertyName,object));
    }
}
于 2014-01-24T00:22:04.067 回答
0

您应该使用is nullis not null。请参阅Oracle 列上的 HQL "is null" 和 "!= null"

于 2013-06-10T06:57:50.450 回答
0

它们不是空安全的。

HQL 将您的 HQL 查询转换为 SQL,然后替换您的参数。所以它不会从 param = 重写查询?参数为空。

Criteria API并使用Restrictions.isNull("f");

于 2013-06-10T06:59:11.167 回答