2012-03-29 1 views
2

IはOneToManyの関係を有する:HQL:ヌル関係にLIKE

public class Class1{ 

    private String attr1; 
    private String attr2; 

    @OneToOne 
    private Class2 object1; 

} 

public class Class2{ 
    private String attr3;  
} 

関係が(私はクラス1のインスタンスは、物体1にNULLを持つことができることを意味する)ヌルオブジェクトを格納することができます。私はすべてに完全な検索をしたい私は、このHQLクエリー作成しましたので、属性:

SELECT p FROM Class1 p 
WHERE 
(
upper(p.attr1) LIKE :filter OR 
upper(p.attr2) LIKE :filter OR 
upper(p.object1.attr3) LIKE :filter 
) 

を、私は前と後に「%」を大文字で文字列のparamを渡す:

query.setParameter("filter", "%"+filter.trim().toUpperCase()+"%"); 

それは、 object1 = nullのエンティティに対しては正常に機能します。それらのエンティティは決して得られません。実際に最後の条件(upper(p.object1.attr3)LIKE:フィルタ)を削除しても機能しますが、それを含める必要があります。

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1 
WHERE 
(
upper(p.attr1) LIKE :filter OR 
upper(p.attr2) LIKE :filter OR 
upper(p1.attr3) LIKE :filter 
) 

または

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1 
WHERE 
(
upper(p.attr1) LIKE :filter OR 
upper(p.attr2) LIKE :filter OR 
(p1 is not null AND upper(p1.attr3) LIKE :filter) 
) 

が、任意の成功なしのように:私のようにそれを書くことを試みたので、私はLEFTを行う必要がありますけれども、私はしました

はその関係で参加します。

ありがとうございました。

答えて

2

私はあなたが値のいずれかp1.attr3 is nullを必要とし、それがnot nullあるとき、それは条件を検証する必要があります理解しています。だから、私はちょうどあなたの最後のクエリを微調整しています。

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1 
WHERE 
(
upper(p.attr1) LIKE :filter OR 
upper(p.attr2) LIKE :filter OR 
(p1.attr3 is null OR upper(p1.attr3) LIKE :filter) 
) 
+0

あなたが私が問題を残したコメントのために見ることができるように別のものでした。だからあなたの答えは大丈夫です(p1がヌルかどうかをチェックする必要はありませんが) – Javi

2

外部結合を使用する必要があります。例えば

SELECT p FROM Class1 p OUTER JOIN p.object1 AS p1 
    WHERE ... ; 
+0

私はこの問題を発見しました。私は外部結合が必要ではありませんでした。私は2つのクエリを1つはカウントし、もう1つは選択するために、私は選択の中で左の結合を変更していました。しかし、提案に感謝します。 – Javi

2
SELECT p FROM Class1 p 
WHERE 
upper(p.attr1) LIKE :filter OR 
upper(p.attr2) LIKE :filter OR 
UNION 
SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1 
WHERE 
upper(p1.attr3) LIKE :filter 
+1

それは動作しますが、非効率です。データベースは、UNIONが使用されるたびに、結果セットの完全な並べ替えを実行する必要があります(UNIONを避けるか、UNION ALLを推奨しますが、ここではUNION ALLは正しくありません)。外部結合は、このケースを処理する効率的な方法です。 Pls。私の反応を見てください。 – Johanna

+0

私はこの問題を発見しました。私は2つのクエリを1つはカウントし、もう1つは選択するために、私は選択の中で左の結合を変更していました。それで、組合をする必要はありません。しかし、ありがとう。 – Javi