2013-10-11 5 views
7

私は空が空の文字列""あるこの休止eqOrIsNullを使用する方法()

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

のようにMySQLの中で2つの行を持っています。

今私はそれらの両方を取得したいです。両方の列でCriteriaRestrictions.eqOrIsNull()を使用しますが、常に1つの行しか返しません。

コードは次のように

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

であり、私が唯一のfoo上の基準を追加するとき、それは2つの行を返します。しかし、barの場合、2番目の値だけが返されます。これは空です。

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("")。グレゴリー answeredのように、 eqisNullの論理和を使うべきだった。このコードは何をしたいない場合

+1

この種の問題では、デバッグログを有効にする必要があります。これは、実行中のSQLをHibernateで印刷します。 – adam0404

+0

これは 'foo、select 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

この場合は動作しますが、1つの列に空でない内容があれば、それも取得されます。 – hsluo

+0

Gotcha、更新された回答を参照してください。 –

+2

これは動作します...なぜこれが 'eqOrIsNull()'と違うのか説明できますか?私はHibernate 4.2.5を使用しています。 – hsluo

2

名前付きプロパティに "equal"制約を適用します。値が の場合は、nullが適用されます。

これは、値としてNULLが渡された場合にのみ、is nullが適用されることを意味します。 他の文字列を値として指定した場合は、equalのみが適用されます。

これは、実行時にパラメータ値の引数として渡される実際の値が不明な場合に便利です。このようなシナリオでは、伝統的な方法で、null以外の条件に基づいてヌルチェック&書き込み基準を設定するか、グレゴリーの答えに記載されている方法で基準を作成する必要があります。

これらの事実をすべて念頭に置いて、質問の回答を得てください。 2番目の引数として空の文字列を指定したため、NULL値を持たない空の値&を含む行のみが取得されます。 2番目の引数としてNULLを指定すると、NULL値を持つ行だけが取得されます。

あなたに役立つかどうか教えてください。

+0

ありがとうございました。私は、ドキュメントとソースコードを読んで、私の問題を発見しました。私の更新を参照してください。 – hsluo