2009-09-24 71 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"))); 

希望澄清