2017-05-16 5 views
1
@Query("SELECT c FROM message c" 
     +" WHERE (CASE WHEN a='' THEN 1=1 ELSE a= :a" 
     + "   WHEN b=''  THEN 1=1 ELSE b= :b" 
     + "   WHEN c=''  THEN 1=1 ELSE c= :c" 
     + "   WHEN d=''  THEN 1=1 ELSE d= :d)") 

パラメータ。私は値の<em>オプション</em>入力a、b、c、dを持ってHQLクエリを記述しようとしています

私の目標は、入力が '='の場合にクエリを認識させ、1 = 1と一緒に移動するだけで何もしないことです。

私はエラーを取得 antlr.NoViableAltExceptionを保つ:予期しないトークンを:=

最初のエラー・トークンは "CASE" だったと、今では "=" です。

"1 = 1アプローチ"は実行可能ですか? HQLでCASE文をこのように使用できますか?あなたは、この操作を行うにはJPQLを使用することを確認してください

@Query("SELECT c " 
       + "FROM message c" 
       + " WHERE" 
       + " CASE (WHEN a != '' THEN a = :a" 
       + " WHEN b != '' THEN b = :b" 
       + " WHEN c != '' THEN c = :c" 
       + " WHEN d != '' THEN d = :d)" 

antlr.NoViableAltException: unexpected token: WHEN 
antlr.NoViableAltException: unexpected token: a 
antlr.NoViableAltException: unexpected token: THEN 
+0

はい、あなたはちょうど 'WHEN b!= '' THEN b =:b' –

+0

を使用してください。 antlr.NoViableAltException:予期しないトークンを取得している理由: –

答えて

1

です:

はあなたに

UPDATED試みをありがとうございましたか!
私はあなたがJPQLを引き続き使用したい場合は、その後、先読み、Query By Example OR QueryDSL

を使用することをお勧め:P

をあなたは条件演算子を使用したい場合は、@QuerysPELを使用することができます。次に、要件に基づいたサンプルクエリを示します。

@Query("SELECT C FROM Message C " + 
     "WHERE 1=1 " + 
     "AND ((1=:#{ #param1 == null ? 1 : 0 }) OR (C.param1 = :#{#param1})) " + 
     "AND ((1=:#{ #param2 == null ? 1 : 0 }) OR (C.param2 = :#{#param2})) " + 
     "AND ((1=:#{ #param3 == null ? 1 : 0 }) OR (C.param3 = :#{#param3})) " + 
     "AND ((1=:#{ #param4 == null ? 1 : 0 }) OR (C.param4 = :#{#param4})) " 
) 
List<Message> find(@Param("param1") Long param1, @Param("param2") Long param2,@Param("param3") Long param3, @Param("param4") Long param4); 

少し説明

  1. まず条件1=1:ヘヘ、WHERE句に次の行の条件に取りつかれ、あなたはそれを削除することができます。
  2. ((1=:#{ #param1 == null ? 1 : 0 }) OR (C.param1 = :#{#param1})):Crazy!
    最初の部分は、2番目の部分をチェックするかどうかを決定します。 param1がnullで、(1=:#{ #param1 == null ? 1 : 0 })1=1を返し、(C.param1 = :#{#param1})がスキップされるとします。
  3. 同じことがさらなる条件に当てはまります。

ご不明な点がございましたら、お気軽にコメントしてください。

ところで、JPQL内のオブジェクトに関してフィールドを使用する必要があります。たとえばparam1ではなく、C.param1となります。

関連する問題

 関連する問題