2017-11-15 20 views
0

列挙型のリストを含む検索条件オブジェクトがあります。JPAクエリ:列挙型リスト列挙型リスト一覧

検索結果には列挙型のリストもあります。

検索条件に列挙されているすべての列挙型を含む検索結果を検索できます。

Iは、(N/A)

私が感じる以下を試みたが、パラメータ値が[ENUM_VALUE_X] が期待型のjava.util.Collectionと一致しませんでした

IllegalArugmentExceptionを取得しています私はどこかで愚かな間違いをしているようですが、それが何であるか理解できません。私は間違って何をしていますか?ここ

String queryStr = "select distinct result from SearchResult result where 
result.enumsList IN :enumsList" 
... 
Query query = entityManager.createQuery(queryStr, SearchResult.class); 
query.setParameter("enumsList", criteria.getEnumsList()); 
//criteria.getEnumsList() = [ENUM_VALUE_X, ENUM_VALUE_Y] 
+0

IN演算子は単一の値の複数の値であるため、明らかに無効な構文です。どんなJPAの医師もこれを伝えます –

+0

SearchResultエンティティを表示してください。 – wypieprz

+0

@BillyFrostそれは私が考えていたものです。しかし、リスト内の各要素を個別にチェックすることなく、リストINリストをチェックする方法はありませんか? – user1825770

答えて

0

は(それが100%機能するが)、これを解決するためにかなり醜いアプローチである:それはいずれかと一致するものの、ここ

List<SomeEnum> enumList = criteria.getEnumsList(); 
StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < enumList.size(); i++) { 
    if (i == 0) { 
     sb.append("WHERE :e").append(i).append(" MEMBER OF result.enumsList"); 
    } else { 
     sb.append(" AND ").append(":e").append(i).append(" MEMBER OF result.enumsList"); 
    } 
} 
Query query = em.createQuery("SELECT DISTINCT result FROM SearchResult result "+ sb.toString(), SearchResult.class); 
for (int i = 0; i < enumList.size(); i++) { 
    query.setParameter("e" + i, enumList.get(i)); 
} 
List<SearchResult> resultList = query.getResultList(); 

は、同様に動作zyexalの提案であり、リストの長さをチェックします。したがって、区切り文字の例外は可能です:

Query query = em.createQuery("SELECT DISTINCT result FROM SearchResult result JOIN result.enumsList e WHERE e IN :enums GROUP BY result HAVING COUNT(distinct e) = :enumsSize", SearchResult.class); 
query.setParameter("enums", criteria.getEnumsList()); 
query.setParameter("enumsSize", criteria.getEnumsList().size()); 
List<SearchResult> resultList = query.getResultList();