2010-01-20 56 views
0

我有兩個對象,條目和樣本。每個條目都有一組相關的樣本,每個樣本都有一個與其相關的投票。我需要在數據庫中查詢所有條目,但對於每個條目,我需要相關的樣本集合排序根據他們的投票屬性:基於嵌套路徑訂購屬性的Hibernate查詢

public Class Entry{ 
    Set<Sample> samples; 
} 

public Class Sample{ 
    int vote; 
} 

我想我已經進行了查詢後排序樣本名單,但事實證明這是一團糟,因爲不能在hibernate集合和java集合之間進行轉換。有人可以幫我改變我的查詢來獲得我需要的結果嗎?

List<Entry> entries = jpaTemplate.find("from Entry"); 

回答

2

我發現了一個令人尷尬的簡單的解決這個問題。有一個完美的@OrderBy JPA註釋:

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
@OrderBy("votes DESC") 
public Set<Sample> getSamples() { 
    return samples; 
} 
0

根據休眠faq: 有三種不同的方法:

  1. 使用的SortedSet或SortedMap的,在某種屬性或或指定一個比較級。這個解決方案在內存中進行排序。

  2. 指定排序依據的表列列表的排序依據屬性或命名。此解決方案僅適用於JDK 1.4+。

  3. 使用過濾session.createFilter(收集, 「爲了通過......」).LIST()

+0

感謝您的回答和鏈接。但是,我仍然不理解如何通過查詢來構建訂單。我不想訂購我收到的結果集,我想訂購其中一個屬性的集合中的元素,它是一個集合 – 2010-01-20 22:07:43

+0

除了你發現自己的解決方案,你自己選擇1和3也適用於集合屬性(例如樣本在你的情況)。所以你可以這樣做: session.createFilter(entries.getSamples(),「order by votes」)。list() – 2010-01-21 06:49:16

+0

這些方法給了你更多的靈活性:你可以在不同情況下使用不同的樣本順序。但是如果你總是需要相同的順序,你的方法很棒 – 2010-01-21 06:50:37