2009-09-11 201 views
4

我在使用Hibernate創建子查詢時遇到問題。不幸的是,子查詢類是幾乎完全沒有證件,所以我絕對不知道如何以下SQL轉換成休眠標準:休眠子查詢

SELECT id 
FROM car_parts 
WHERE car_id IN (SELECT id FROM cars WHERE owner_id = 123) 

我希望下面會「只是工作」:

session.createCriteria(CarParts.class).add(eq("car.owner", myCarOwner)); 

但不幸的是它沒有。所以看來我實際上必須使用Subqueries類來創建Criteria。但我無法通過谷歌找到一個合理的例子,所以這讓我在這裏問它。

回答

5

嘗試加入EQ表達這樣之前創建的別名「汽車」屬性:

session.createCriteria(CarParts.class) 
     .createAlias("car", "c") 
     .add(eq("c.owner", myCarOwner)); 
0

由於先檢查汽車和CarPart實體之間的ORM的配置,通常你需要設置之間的關係他們。之後,嘗試執行以下代碼:

List result = session.createQuery("from " + CarPart.class.getName() + 
    " as parts join parts.car as car where car.owner = :myOwner") 
    .setParameter("myOwner", 123) 
    .list(); 
7

嘗試像這樣:

表詳細信息):類別(ID,姓名,遞減,parentId的,活躍的)

DetachedCriteria subCriteria = DetachedCriteria 
      .forClass(Category.class); 
    subCriteria.add(Restrictions.isNull("parent")); 
    subCriteria.add(Restrictions.eq("active", Boolean.TRUE)); 
    subCriteria.add(Restrictions.eq("name", categoryName)); 
    subCriteria.setProjection(Projections.property("id")); 

    Criteria criteria = getSession().createCriteria(Category.class); 
    criteria.add(Restrictions.eq("active", Boolean.TRUE)); 
    criteria.add(Subqueries.propertyEq("parent", subCriteria)); 

它會生成查詢,如:

選擇 * 從 分類THIS_ 地方 this_.active = 1 和this_.parentId =( 選擇 this0_ .ID爲Y0 從 分類this0__ 其中 this0_ .parentId爲空 和0類別 _.active = 1 和this0__。 name ='Health Plan' )

祝你好運!

-Rohtash辛格

+2

criteria.add(Subqueries.propertyEq( 「父」,子標準));這裏的父母是什麼? – 2015-11-10 16:50:21