一尘不染

如何使用Hibernate eqOrIsNull()

hibernate

我在MySQL这样有两行

+---------+---------+
| foo     | bar     |
+---------+---------+
|         | NULL    |
|         |         |
+---------+---------+

空字符串是空的""

现在,我想同时获得它们。我在两列上都使用CriteriaRestrictions.eqOrIsNull(),但是它总是只返回一行。

代码是这样的

criteria.add(Restrictions.eqOrIsNull("foo", ""));
        .add(Restrictions.eqOrIsNull("bar", ""));

当我仅在上添加条件时foo,它将返回两行。但是对于bar,它仅返回第二个,它为空。

javadoc的说,Apply an "equal" constraint to the named property. If the value is null, instead apply "is null".所以我会收到这个错误,还是应该以其他方式使用?

更新
对不起,我好粗心。该文件清楚地说明了这一点。此方法根据value传递给它的方法工作,而不是存储在DB中的命名属性的实际值。Github
上的源代码:

public static Criterion eqOrIsNull(String propertyName, Object value) {
    return value == null
            ? isNull( propertyName )
            : eq( propertyName, value );
}

因此,就我而言,eqOrIsNullreturn eq("")。我本该eqisNullGregory回答一样使用and的。


阅读 490

收藏
2020-06-20

共1个答案

一尘不染

检查此代码是否满足您的要求-

criteria.add(Restrictions.or(Restrictions.eq("foo", ""), Restrictions.isNull("foo")))
                .add(Restrictions.or(Restrictions.eq("bar", ""), Restrictions.isNull("bar")));

该代码段使用了Hibernate 3.5.0-CR-2 API。

2020-06-20