2009-01-06 62 views
3

Hibernate API是否支持List之外的集合形式的對象結果集?Hibernate能否返回一個比List更爲結果對象的集合?

例如,我有一個運行數十萬次迭代的過程,以便爲客戶端創建一些數據。此過程使用Value表中的記錄(例如)爲每個迭代創建此輸出。

隨着列表我將不得不遍歷整個列表,以找到一個特定的價值,這是昂貴的。我希望能夠返回一個TreeMap並以編程方式指定一個鍵,以便我可以在集合中搜索我需要的特定值。 Hibernate可以爲我做這個嗎?

+0

是否有理由不能在where子句中指定您的條件? – 2009-01-06 15:35:31

+0

我試圖將我想要使用的整個對象集合到內存中,這樣我就可以減少對數據庫的調用。如果我爲每次迭代調用一個SELECT,我正在查看成千上萬的調用,運行速度非常慢。 – karlgrz 2009-01-06 15:40:47

+0

「所以我可以減少對數據庫的調用」 - 它似乎沒有工作,因爲你有成千上萬的電話。您可能需要更聰明的查詢或更好的緩存解決方案。 – duffymo 2009-01-07 11:08:45

回答

2

我想你指的是Query.list()方法。如果是這樣:否,除了List以外,沒有辦法返回頂級結果。如果您收到的結果太多,爲什麼不向數據庫發出更受限制的查詢?如果查詢難以限制,您可以使用Hibernate的List的內容填充自己的Map,然後丟棄列表。

1

Java Persistence with Hibernate

  • 甲java.util.Map可以與 <map>,保存鍵和值 對被映射。使用java.util.HashMap至 初始化一個屬性。
  • java.util.SortedMap可以映射 與<map>元件,以及排序 屬性可以被設置到任何一個 比較器或自然順序爲在內存中 排序。使用java.util.TreeMap 實例初始化 集合。
+0

就像旁邊一樣,您可以使用List/SortedList,Set/SortedSet,Map/SortedMap,Collection/Bag和primitive-array用Hibernate分組對象。 – Elie 2009-01-06 15:37:46

1

是的,可以做到。

但是,您可能必須讓您的域名類實現Comparable;我認爲你不能用比較器來做。

編輯: 這似乎是我誤解了這個問題。如果您正在討論特設查詢的結果,那麼上述內容將無助於您。如果查詢是固定的,則可以通過將具有TreeMap屬性的對象綁定到數據庫視圖來使其工作。

當然,您可以隨時自行構建地圖,而且工作量和處理開銷都很小。

2

如果我理解正確,將數據庫中的一堆數據加載到內存中,然後通過查找該列表中的某些對象在本地使用它們。

如果是這樣,我會看到2個選項。

  1. 不加載所有數據,但對於每次迭代訪問數據庫的查詢只返回您需要的特定記錄。這會使更多的數據庫查詢,所以它可能會緩慢,但內存消耗少得多。通過添加緩存可以輕鬆改進此解決方案,以便大多數使用的值可以快速獲得。它當然需要一些性能測量,但我通常喜歡具有良好緩存的幼稚解決方案,因爲緩存可以作爲交叉關注點實現,並且對程序員非常透明。
  2. 如果你真的想把所有的數據加載到內存中(這實際上是一種緩存形式),將數據從列表轉換爲TreeMap(或任何其他有效結構)的時間可能會比完整的處理。所以你可以自己做數據轉換。

正如我所說的,在一般情況下,我贊成用高速緩存的解決方案...

相關問題