2011-12-28 169 views
2

我對Hibernate Criteria不是很熟悉,如果這個問題太簡單了,我表示歉意......但是,非常感謝任何幫助!Hibernate Criteria集合屬性(子查詢?)

我有兩個實體,CD和Track。每張CD都有音軌對象的集合。在每個軌道中都有一個名爲「title」的字符串字段。現在我想要使用Hibernate Criteria檢索所有具有「title」設置爲特定值的Track的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

謝謝!我設法讓你的最後一個解決方案工作,加入。另外兩個映射異常失敗,Unknown entity:null我相信這是因爲「track.cd」,因爲「cd」不是Track中的字段。僅從CD到Track的關係是定向的。還是我在這裏錯了? – user1119371 2011-12-28 15:28:45

+0

不,你說得對。我認爲該協會是雙向的,並且一個賽道有一個CD場。 – 2011-12-28 15:32:23

+0

那麼,通過使用子查詢是不可能的?由於關聯不是雙向的,唯一的方法是使用連接? – user1119371 2011-12-28 15:56:43

0

您可以在沒有連接的情況下實際執行此操作 - 只需使用alias的字符串值的cdCriteria.getAlias()位置即可。因此,關鍵線將是:

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

這使用hibernate內部別名,而不是用戶定義的別名。 – 2012-04-17 17:55:51

相關問題