2012-05-29 116 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%如何用於預測(也就是說,如果你可以有預測的子標準)。我只是堅持已有的別名方法。