@Entity
class A {
@ManyToMany
private List<B> list;
...
}
@Entity
class B {
...
}
基準(SQLクエリではない)を使用してクラスからリストを取得したいと考えています。これは可能でしょうか?この場合の投影は機能しません。多対多エンティティプロパティの休止状態の基準
@Entity
class A {
@ManyToMany
private List<B> list;
...
}
@Entity
class B {
...
}
基準(SQLクエリではない)を使用してクラスからリストを取得したいと考えています。これは可能でしょうか?この場合の投影は機能しません。多対多エンティティプロパティの休止状態の基準
残念ながら、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));
あなたはクラスが適切なゲッターセッターに設定されている場合
a.getList();
(Aのインスタンスであると仮定した場合)を呼び出すことができるはずです。私はCriteriaクエリの必要性を見ません。
あなたはexempleのための公演の問題については、SQL/HQL /基準クエリでそれを行うことができて便利なことができないオブジェクトであることを行うことができますので、それはないです... –
アルIN文がSGDBによって制限されることがあることに注意してください(例として、OracleではIN文に1000個の値しか入れることはできません)。おそらく、別のクエリを実行してリストを取得し、それをサブリスト(グアバパーティション関数?)に分割し、すべてのサブリストを再度実行してください。 –
INステートメントはこの場合サブクエリを使用し、リテラルのリストは使用しません値。この場合、サブクエリによって返される項目の数に制限はありません。 –
ああ、おかげで、限界は両方のためにあったが、とにかく本当の苦痛になるだろう... –