2011-09-07 62 views

回答

1

它在休眠標準文檔解釋:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-detachedqueries

甲的DetachedCriteria也可被用於表達子查詢。涉及子查詢的標準實例可以通過子查詢或屬性獲取。

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class) 
    .setProjection(Property.forName("weight").avg()); 
session.createCriteria(Cat.class) 
    .add(Property.forName("weight").gt(avgWeight)) 
    .list(); 

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class) 
    .setProjection(Property.forName("weight")); 
session.createCriteria(Cat.class) 
    .add(Subqueries.geAll("weight", weights)) 
    .list(); 

相關子查詢也是可能的:

DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2") 
    .setProjection(Property.forName("weight").avg()) 
    .add(Property.forName("cat2.sex").eqProperty("cat.sex")); 
session.createCriteria(Cat.class, "cat") 
    .add(Property.forName("weight").gt(avgWeightForSex)) 
    .list(); 
+0

謝謝!但是我仍然不清楚如何將這個應用於我暴露的問題?你可以編輯你的問題,以解決一些僞代碼?謝謝! – edutesoy

+0

你的子查詢應該由DetachedCriteria實例實現,然後用在你的主標準中。 – Guillaume

+0

是的,我知道,但我不知道如何應用「IN」條款。 – edutesoy

1

我非常新的HQL,但我建議像下面這樣:

DetachedCriteria sub1 = DetachedCriteria.forClass(Entitiy2); 
DetachedCriteria sub2 = DetachedCriteria.forClass(Entity3); 

Criteria criteria = getYourSession().createCriteria(Entity_1.class, "obj"); 
criteria.add(Restrictions.or(Subqueries.propertyIn("obj", sub1), Subqueries.propertyIn("obj", sub2)); 

請糾正我,如果我錯了。