2012-08-31 189 views
0

我想翻譯一個簡單的HQL到Criteria API,任何人都可以幫我嗎? 這是我的HQL:休眠HQL到標準

SELECT ch FROM Parent p JOIN p.childeren ch WHERE p.id = :id

因此,我讓孩子們。重要的是,從兒童到家長沒有任何關係。 有一個在家長對孩子只關係是這樣的:

 
@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }) 
@JoinColumn(name="parent_id") 
private List children; 

我怎樣才能獲得使用標準的API相同的結果?

+0

從孩子到家長沒有關係?請告訴我們你的映射。 –

+0

原始問題不在於孩子和家長。我已經改變了它,使我的問題更清楚。 –

回答

1

只有獲取相關的實體是使用標準的API一個巨大的痛苦。您需要子查詢:

DetachedCriteria subCriteria = DetachedCriteria.forClass(Parent.class); 
    subCriteria.createCriteria("children", "c"); 
    subCriteria.setProjection(Projections.property("c.id")); 
    subCriteria.add(Restrictions.eq("id", 1)); 
    // Assuming Children is the name of the class 
    Criteria criteria = sess.createCriteria(Children.class); 
    criteria.add(Subqueries.propertyIn("id", subCriteria)); 
    criteria.list(); 
0

解決此問題的一個可能的解決方案是使用sqlRestriction,如下例所示,但這並不好,因爲它需要使用數據庫列名稱。

Criteria crit = sessionFactory.getCurrentSession().createCriteria(Child.class); crit.add(Restrictions.sqlRestriction("{alias}.parent_id = ?", parentId, LongType.INSTANCE));

是否有人有更好的解決辦法?

0

你並不需要爲這個查詢,因爲你可以這樣做:

Set<Child> children = session.get(Parent.class, id).getChildren(); 
children.size(); // trigger lazy initialization 
+0

問題是「如何將HQL轉換爲Criteria-API?」您的解決方案不是Criteria API。 –