2013-10-11 104 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