2011-12-28 16 views
2

私はHibernate Criteriaに慣れておらず、この質問が単純すぎる場合はお詫びします...しかし、どんな助けでも大歓迎です!Hibernate Criteriaコレクションのプロパティ(サブクエリ?)

私は2つのエンティティCDとトラックを持っています。各CDにはトラックオブジェクトのコレクションがあります。各トラックには、 "title"という名前のStringフィールドがあります。今、私はHibernate Criteriaを使って、 "タイトル"が一定の値に設定されたトラックを持つすべてのCDを取得したいと思っています。私が今までに持っているのはこれです:

//session handling 
Criteria cdCriteria = session.createCriteria(CD.class); 
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class); 
trackCriteria.add(Restrictions.eq("title", "SomeTitle")); 
trackCriteria.setProjection(Projections.property("title")); 
criteria.add(Subqueries.exists(trackCriteria)); 
List<CD> cds = criteria.list(); 

これはトラックのタイトルに関係なくすべてのCDを返します。誰か提案はありますか?

ありがとうございます。

答えて

9

あなたはソリューションに非常に近いです。あなただけのCDのトラックでなければならないトラックよりも明記制限を逃した:

Criteria cdCriteria = session.createCriteria(CD.class, "cd"); 
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track"); 
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle")); 
trackCriteria.add(Restrictions.propertyEq("track.cd.id", "cd.id")); 
trackCriteria.setProjection(Projections.property("track.title")); 
criteria.add(Subqueries.exists(trackCriteria)); 
List<CD> cds = criteria.list(); 

または

Criteria cdCriteria = session.createCriteria(CD.class, "cd"); 
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track"); 
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle")); 
trackCriteria.createAlias("track.cd", "trackCd"); 
trackCriteria.add(Restrictions.propertyEq("trackCd.id", "cd.id")); 
trackCriteria.setProjection(Projections.property("track.title")); 
criteria.add(Subqueries.exists(trackCriteria)); 
List<CD> cds = criteria.list(); 

ます。また、サブクエリを避け、単に参加使用することができます

Criteria cdCriteria = session.createCriteria(CD.class, "cd"); 
criteria.createAlias("cd.tracks", "track"); 
criteria.add(Restrictions.eq("track.title", "someTitle")); 
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 
+0

ありがとう!私は、あなたの最後のソリューションをジョインで動かすことができました。他の2つは、マッピング例外で失敗します。Unknown entity:null "track.cd"のために、 "cd"はTrackのフィールドではないためです。関係は、CDからトラックのみの方向性です。または私はここで間違っていますか? – user1119371

+0

いいえ、そうです。私はアソシエーションが双方向で、トラックにcdフィールドがあると仮定しました。 –

+0

サブクエリを使用して解決することは不可能ですか?アサーションは双方向ではないので、唯一の方法はジョインを使うことです。 – user1119371

0

これは実際に結合なしで行うことができます - 単にエイリアスの文字列値のcdCriteria.getAlias()を使用してください。したがって、キーラインは次のようになります:

trackCriteria.add(Restrictions.propertyEq("trackCd.id", cdCriteria.getAlias() + ".id")); 
+1

これは、ユーザーが定義したものではなく、休止状態の内部エイリアスを使用します。 –

関連する問題