2009-09-24 27 views
7

我把這個類映射爲一個實體,我們稱它爲Person。 Person與Address有嵌入式/組件關係。我無法使用將返回地址對象的條件。 我試過這個:使用Hibernate Criteria API檢索嵌入式或組件

Criteria.createCriteria(Address.class) 

這是行不通的。我想我需要通過實體,但是然後我需要某種投影?

Criteria.createCriteria(Person.class).<<what goes here???>> 

建議?

回答

6

部件的壽命由其所有者控制;他們不被視爲協會。因此,您無法從查詢中自行檢索組件。但是,您可以在條件中使用它。

假設你的「地址」類被映射爲「地址」中的「人」,你可以這樣做:

Criteria.createCriteria(Person.class) 
.add(Restrictions.eq("address.street", street)); 
+0

好的,但是怎麼來的,我可以做一個HQL和直接檢索地址?爲什麼不一樣適用於查詢? – Konstantin 2009-09-25 10:32:56

+0

因爲HQL具有Criteria API不具備的功能。現在,如果你真的想不惜任何代價返回你的地址,你可以爲基於Person的標準創建一個投影列表,該列表將包含Address的每個屬性(並且不包含其他任何屬性),並將AliasToBeanResultTransformer應用於結果。但這是一個令人頭痛的問題,沒有什麼可以證明的。我會選擇完整的Person,並在java代碼中提取Address(如果這就是你需要的)。或者使用HQL。 – ChssPly76 2009-09-25 17:57:31

0

這是一個如何檢索或引用休眠嵌入對象的屬性。上述

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
       Parent.class,"parent"); 
criteria.createAlias("embeddedObjectFieldName", "parent.embeddedObjectFieldName"); 

criteria.setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("parent.propertyOne")) 
       .add(Projections.max("embeddedObjectFieldName.embeddedobjectproperty"))); 

希望澄清