2017-05-04 21 views
9

私は、2つのパラメータをとるスプリングデータリポジトリインタフェースを使用したいと考えています。次のような動作をさせる方法はありますか?スプリングデータ - null値を持つパラメータを無視する

MyObject findByParameterOneAndParameterTwo(String parameterOne, String parameterTwo); 

両方のパラメータに値がある場合は、正常に動作し、両方の値に対して「AND」を実行します。

例えば2番目のパラメータがnullの場合、それだけでParameterOne

任意の提案をして検索しますか?

+1

Springデータで提供されるリポジトリメソッド名からクエリを派生させるメカニズムは、クエリが事前にわかっている場合を想定しています。実行時にのみ正確に知られているクエリでそのメカニズムが機能することは期待できません。動的な状況の場合、 '@ Query'やQueryDSLのようないくつかのオプションがあります。 SQLとJPAは 'COALESCE'関数をサポートしています。この関数は時には' NULL'値を持つ可能性のあるパラメータを回避するために使用できます。 @Query( "MyObject eからのSELECT eからCOALESCE(e.parameterOne、?1)=?1 AND COALESCE(e.parameterOne、?2)=?2") 'が動作するはずです。 – manish

+1

@manish私は 'COALESCE(?1、e.parameterOne)= e.parameterOne'はあなたの意図だと思います。 – Blank

+0

@Forward、私はポスターが正確に動作するようにポスターがどのようになっているかわからないので、ポスターに指示を与えただけです。例えば、データベースにそれらの列の 'null'値を含めることができるかどうか、そして' yes 'の場合は、どのようにして一致するかなどが指定されていません。しかし、はい、投稿されたものだけに基づいて、あなたのコメントにスポットがあります。 – manish

答えて

6

私はそれがリポジトリメソッドの命名では可能であるわからないんだけど、あなたは現在、これがSpring-data-jpaでは不可能である@Query

よう
(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo) 
+1

'isnull'を' is null'に変更する必要がありますか? – Searene

+0

@Searene、はい、あなたは正しいです –

5

を使用することができます。

Springチームによる調査中であるこのに関するJIRAticketがあります。

ただし、回避策が必要な場合は、簡単な条件クエリの例hereをチェックアウトすることができます。

0

Repoを別のクラスとして使用できるかどうかはわかりませんが、オプションパラメータでStringBuilderの追加クエリを使用できます。これは間違いなく有効です

StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("select p.name from personDemographic p "); 
    Boolean flag = true; 
    if(parameterOne != null){ 
     if(flag){ 
      queryBuilder.append("where condition..."); 
      flag=false; 
     } 
     } 
    if(parameterOne != null){ 
    if(flag){ 
    queryBuilder.append("where condition..."); 
    flag = false; 
    }else{ 
     queryBuilder.append("and condition..."); 
    } 
    Query query = entityManager.createQuery(queryBuilder.toString()); 
関連する問題