2009-05-01 58 views
1

我有一個對象列表,列表中的每個對象都有一個位置,除非明確更改,否則這些位置不會更改,換句話說,對象位於隊列中。我應該在實體類中使用什麼樣的集合來存儲這些對象,以及該集合應該如何註釋?如何保證集合中項目的順序

我現在有這個

@Entity 
class Foo { 
    ... 
    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL) 
    List<Bar> bars = new ArrayList<Bar>(); 
    ... 
} 

如果這是不可能的JPA單純,我使用的EclipseLink作爲我JPA提供商,所以具體的EclipseLink註解會確定,如果沒有別的幫助。

編輯:注意人,問題不是Java不會保存順序,我知道大多數集合都這樣做,問題是我不知道JPA保存順序的智能方式。有一個訂單ID和查詢順序是可能的,但在我的情況下維護訂單ID是費力(因爲用戶界面允許重新排序項目),我正在尋找一個更聰明的方式來做到這一點。

回答

4

如果您希望在往返於SQL之後對其進行排序,那麼您應該在實體本身內提供某種排序ID - SQL自然是面向設置的,而不是面向列表的。然後,您可以在將它們取回之後進行排序,或者確保您的查詢也指定排序。

如果你給實體一個自動生成的整數ID,這個可能工作,但我不想保證它。

0

您可以

  1. 排序之前創建
  2. 排序列表列表創建
  3. 使用執行上插入排序的集合之後。 TreeMap中,TreeSet中
+0

雖然查詢後排序將是一種選擇,提問的問題是不是與使用的數據結構,但JPA提供程序確定列表項插入的順序。我沒有答案(我正在尋找相同的問題),我可以說這個答案正在解決錯誤的問題。 – metasim 2012-12-04 20:27:36

0

鏈表實現Java中的隊列inteface,並允許您添加的東西在中間......

TBH大部分藏品是有序的不是他們......

檢查文檔,大多數說他們是否訂購。

0

但值得一試的是LinkedList,而不是ArrayList,正如Jon所說,你需要找到一種持久化訂單信息的方式。

一個解決方案可能會涉及到每個條目發出一個訂單號,並將其存儲爲一個SortedMap,當轉換成List時,如果List是您需要的。

但是,如果將集合存儲爲LinkedList,ORM可能足夠聰明,可以爲您完成所有轉換。

4

按照Jon的建議,使用排序順序ID,然後在@OneToMany下面添加@OrderBy註釋。這將命令指定字段的任何查詢。

舉個例子,如果你添加一個名爲「sortId」到酒吧新的領域,富應該是這樣的:

@Entity 
class Foo { 
    ... 
    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL) 
    @OrderBy("sortId ASC") 
    List bars = new ArrayList(); 
    ... 
} 
相關問題