2012-05-24 33 views
24

Criteria API .in式でパラメータリストを使用する可能性はありますか? value()はないリストlong型のPARAMTERを期待しているようJPA Criteria API IN式パラメータリスト

List<Long> list = new ArrayList<Long>(); 
    list.add((long)1); 
    list.add((long)2); 
    list.add((long)3); 


CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Bewerbung> criteriaQuery = cb.createQuery(Bewerbung.class); 
Root<Bewerbung> bewerbung = criteriaQuery.from(Bewerbung.class); 

criteriaQuery.select(bewerbung).where(
cb.in(bewerbung.get(Bewerbung_.bewerberNummer)).value(list); 

return em.createQuery(criteriaQuery).getResultList(); 

.value(list)は動作しません:

私はこのような何かを持っています。 私の場合、サブクエリは使用できません。 誰でもこの問題について私を助けることができますか?

答えて

29
cb.isTrue(bewerbung.get(Bewerbung_.bewerberNummer).in(list)); 

は、AFAIKを行う必要があります。

+0

グレート、おかげで、私は、Hibernateを使用することだし、それはHibernateがメソッドのパラメータ「の」javax.persistence.criteria.Expressionのパラメータとして空のコレクションをサポートしていないようです:これで十分です。 http://lists.jboss.org/pipermail/hibernate-issues/2011-December/035927.html – user1414341

+0

AFAIKを参照してください。誰もサポートしていません。空のリストが引数として渡された場合には、おそらく問合せを短絡するべきです。 –

+0

この式(isTrueでラップされています)が、EclipseLink 2.6.2では例外PREDICATE_PASSED_TO_EVALUATIONを発生させますが、私の例では述語として完璧に機能します。 –

31

CriteriaBuilder#isTrueを使用する必要はありません。この作品

criteriaQuery.select(bewerbung) 
      .where(bewerbung.get(Bewerbung_.bewerberNummer) 
      .in(list)); 
+0

「必要はない」の代わりに「してはいけない」と言います。少なくともEclipseLink 2.6.2を使用してください。私はテストしました。 –

+0

@MiklosKrivanまあ、どちらもうまくいくはずです、これは私にはっきりと見えます。 – jFrenetic

+0

私も同様に期待していますが、残念なことにORMのためにEclipseLink 2.6.2を使用しています(私は両方の式を試しました)isTrue()ラッピングは上記の例外を発生させます。それが私の言葉遣いが与えられた理由です。だから理論的には「必要はない」が、実際には「してはならない」。 –

関連する問題