2012-05-29 63 views
1

我有以下代码:嵌套属性路径

Session session = (Session) em.getDelegate(); 
Criteria c = session.createCriteria(Term.class); 
c.setProjection(
     Projections.projectionList() 
       .add(Projections.property("id")) 
       .add(Projections.property("qualifier")) 
       .add(Projections.property("preferred")) 
       .add(Projections.property("terminology.definition")) 
); 
c.list(); 

但对Hibernate的扼流圈terminology.definition与异常 org.hibernate.QueryException:无法解析属性:的terminology.definition:净。 * .Term

尽管存在Term属性:

@OneToOne(mappedBy = "term") 
public Terminology getTerminology() { return terminology; } 

Terminology有一个名为definition一个@Basic属性。我可以用一个看起来很愚蠢的别名修复它:

session.createCriteria(Term.class).createAlias("terminology", "terminology") 

但是这是不希望的。

+0

因为hibernate使用它来加入你的表格,所以你需要你看起来很愚蠢的别名。 _Projections_就像查询的select子句,所以你只能在你的代码中声称它不属于你的实体_Term_作为一个属性的术语属性 – richarbernal

回答

4

这是非常标准的选择正在完成的方式。术语主要就像通过SQL端的连接引入的,但就查询而言,您必须定义别名才能访问连接的表。

事实上,如果你看的javadoc,Criteria类,甚至还有它的一个例子:

You may navigate associations using createAlias() or createCriteria(). 
List cats = session.createCriteria(Cat.class) 
    .createCriteria("kittens") 
     .add(Restrictions.like("name", "Iz%")) 
    .list(); 

List cats = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kit") 
    .add(Restrictions.like("kit.name", "Iz%")) 
    .list(); 

你会发现你可以使用别名和“”符号,或者您可以使用带有直接属性名称的“createCriteria”。

但是,此示例适用于where子句。不是100%如何用于预测(也就是说,如果你可以有预测的子标准)。我只是坚持已有的别名方法。