2012-05-22 46 views
3

我將從一個清理過的示例開始。使用特定子類查找行的條件查詢

在我的系統中,我有Car類。汽車有許多領域,其中GearShift是gearShift類的gearShift實例。

public class Car { 
    private GearShift gearShift; 

    // Snip 
} 

GearShift是一個抽象類,AutomaticShift和StickShift從該類繼承。這在Hibernate中被映射爲每個子類的表。

現在,比如說我想讓自動變速的汽車。我更喜歡通過Hibernate標準來做到這一點,所以我想象一下我可以添加的「type」限制,如下所示。

getSession().createCriteria(Car.class) 
    .add(Restrictions.ofType(AutomaticShift.class) 
    .list(); 

這有可能以任何方式嗎?

+0

你的映射如何?你使用鑑別器嗎? – Selim

+0

爲什麼使用HQL不是一種選擇? Criteria API不公開完整的Hibernate功能。 –

回答

9

OLD:

這個怎麼樣?

getSession().createCriteria(AutomaticShift.class).list() 

編輯:

這應該做的伎倆;

getSession().createCriteria(Car.class).createAlias("gearShift", "gs").add(Restrictions.eq("gs.class", AutomaticShift.class)).list(); 
+0

這隻會返回自動齒輪列表。 -1這個 –

+0

@RaulGogo:這就是我雖然他想做的事:S你明白不同嗎? – Selim

+0

他想要一個**汽車列表**自動齒輪。 –

0

也許這聽起來像一個開銷一點點,但你可以做到這一點在2個步驟:

  1. 檢索自動排擋的所有ID:

    List<Long> automaticGearIds = getSession().createCriteria(AutomaticShift.class) 
                 .setProjection(Projections.distinct(Property.forName("id"))) 
                 .list(); 
    
  2. 獲取所有帶自動檔的車:

    return getSession().createCriteria(Car.class).add(Restrictions.in("gearShift.id", automaticGearIds)).list(); 
    
+0

在這種情況下使用Restrictions.in是不好的做法。 – vhtc