2011-12-16 13 views

答えて

4

残念ながら、Criteriaではルートエンティティのみを選択できます。結合エンティティは選択できません。したがって、ManyToManyが双方向であれば簡単になります。あなたは、このように使用することはオプションではない場合

select b from B b inner join b.as a where a = :theA 

の同等の基準は、私が唯一の方法は、サブクエリを使用することだと思うので、

と同等の基準をコーディング
select b from B b where b.id in (select b2.id from A a inner join a.list b2 where a.id = :theAId) 

コードでしょうができました次のようになります。

Criteria c = session.createCriteria(B.class, "b"); 

DetachedCriteria dc = DetachedCriteria.forClass(A.class, "a"); 
dc.createAlias("a.list", "b2"); 
dc.add(Restrictions.eq("a.id", theA.getId())); 
dc.setProjection(Projections.property("b2.id")); 

c.add(Subqueries.propertyIn("b.id", dc)); 
+0

アルIN文がSGDBによって制限されることがあることに注意してください(例として、OracleではIN文に1000個の値しか入れることはできません)。おそらく、別のクエリを実行してリストを取得し、それをサブリスト(グアバパーティション関数?)に分割し、すべてのサブリストを再度実行してください。 –

+0

INステートメントはこの場合サブクエリを使用し、リテラルのリストは使用しません値。この場合、サブクエリによって返される項目の数に制限はありません。 –

+0

ああ、おかげで、限界は両方のためにあったが、とにかく本当の苦痛になるだろう... –

-1

あなたはクラスが適切なゲッターセッターに設定されている場合

a.getList(); 

(Aのインスタンスであると仮定した場合)を呼び出すことができるはずです。私はCriteriaクエリの必要性を見ません。

+1

あなたはexempleのための公演の問題については、SQL/HQL /基準クエリでそれを行うことができて便利なことができないオブジェクトであることを行うことができますので、それはないです... –

関連する問題