2013-10-11 59 views
7

我有两个排在MySQL这样如何使用Hibernate eqOrIsNull()

+---------+---------+ 
| 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".所以我得到这个错误,或者应该以其他方式使用?

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

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

所以,eqOrIsNull回报eq("")。我应该使用eqisNull的分离,如Gregory answered

+1

对于这类问题,您应该启用调试日志记录。它会让hibernate打印正在执行的sql。 – adam0404

+0

就像'select foo,bar from table where foo =?和bar =?' – hsluo

回答

2

检查该代码你想要做什么 -

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。

+0

它在这种情况下工作,但如果一列有非空内容,它也会得到。 – hsluo

+0

嘿,看到更新的答案。 –

+2

这一个工程...你能解释为什么这是不同于'eqOrIsNull()'?我使用Hibernate 4.2.5。 – hsluo

2

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

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

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

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

让我知道,如果这对你有帮助。

+0

感谢您的解释。我已阅读文档和源代码,发现我的问题。查看我的更新。 – hsluo