如何使用Hibernate eqOrIsNull()

我在这里有两行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". Apply an "equal" constraint to the named property. If the value is null, instead apply "is null". 那么,我是否弄错了,或者应该以其他方式使用?

更新
对不起,我很粗心。 该文件明确指出。 此方法根据传递给它的value工作,而不是存储在数据库中的命名属性的实际值。
Github上的源代码:

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

所以在我的情况下, eqOrIsNull返回eq("") 。 我应该使用eq isNull ,并且isNull ,就像格雷戈里回答的那样。


检查这段代码是否符合你的要求 -

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。


对指定的属性应用“相等”约束。 如果该值为空,则应用“is null”。

这意味着,仅当NULL作为值传递时才会应用is null 。 如果您指定的任何其他字符串值,只equal将应用于这一点。

当您不确定在运行时传递的实际值作为参数值的参数时,这非常有用。 在这种情况下,以传统的方式,或者您需要根据非空条件设置非空的检查和写入条件,或者您需要按照Gregory的答案所述的方式编写标准。

牢记所有这些事实,你应该得到你的问题的答案。 您只会获取包含空值的行,而不是具有空值的行,因为您已将空字符串指定为第二个参数。 如果您将NULL指定为第二个参数,则只会获得具有NULL值的行。

让我知道这对你有帮助。

链接地址: http://www.djcxy.com/p/74877.html

上一篇: How to use Hibernate eqOrIsNull()

下一篇: NSStream Failing To Receive Data