9

このようにMySQLに2つの行があります

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

empty は空の文字列""です。

今は両方手に入れたいと思っています。Criteria両方の列でandを使用しRestrictions.eqOrIsNull()ていますが、常に 1 行しか返されません。

コードはこんな感じ

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

のみに基準を追加するとfoo、2行が返されます。ただし、 の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 );
}

だから私の場合、eqOrIsNull戻りますeq("")。グレゴリーが答えeqたように、 andの選言を使うべきでした。isNull

4

3 に答える 3

4

名前付きプロパティに「等しい」制約を適用します。値が null の場合は、代わりに「is null」を適用します。

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

これは、実行時にパラメーター値の引数として渡される実際の値が不明な場合に役立ちます。このようなシナリオでは、従来の方法で、not null 条件に基づいて not null チェック & 書き込み基準を設定するか、Gregory の回答で言及されている方法で基準を作成する必要があります。

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

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

于 2013-10-12T08:44:09.777 に答える