2009-12-17 107 views
3

我使用GWT作爲UI和Hibernate/Spring的buisness-layer.Following GWT小部件用於顯示記錄。(http://collectionofdemos.appspot.com/demo/com.google.gwt.gen2.demo.scrolltable.PagingScrollTableDemo/PagingScrollTableDemo.html)。我假設排序在客戶端完成。客戶端排序+休眠尋呼?

我不檢索整個結果集,因爲它的巨大。 我使用

principals = getHibernateTemplate().findByCriteria(criteria, 
        fromIndex, numOfRecords); 

以檢索data.Theres沒有標準在休眠層排序。

此方法不會給出正確的行爲,因爲它只對客戶端中的當前數據集進行排序。

這個問題的最佳解決方案是什麼?

注:我可以使用UI框架獲取主排序列和其他排序列。 可能我可以使用主要排序列在休眠層排序結果?

回答

4

您需要在服務器上排序。

此後,您可以:

  • 發送完整的結果集到客戶端和手柄分頁在客戶端。問題是結果集可能很大,從數據庫中檢索併發送到客戶端。

  • 處理服務器端分頁。客戶端和服務器一次只從數據庫請求一個頁面。接下來的問題是,每次你向db請求一個特定的頁面時,你都會一次又一次地排序相同的數據來提取頁面1,頁面2等等。這可能是大型數據庫的問題。

  • 兼得之間的權衡(大型數據庫):

    • 設定一個上限,比如300項
    • 的服務器請求的第一個301個項目分貝根據訂單通過
    • 服務器在緩存
    • 客戶端請求的頁面服務器頁面keept結果集(最多301項)
    • 服務器處理ŧ他使用緩存分頁
    • 如果有301個項目,客戶端顯示「該命中列表包含超過300個項目。它已被截斷「。

注1:通常情況下,客戶並不關心,如果他不能去最後一頁。您可以改進解決方案,先計算總行數(此時不需要訂購),以便您可以顯示對用戶更好的消息,例如, 「結果包含2023個元素,只有前300個可以查看」。注2:如果您在不使用任何順序標準的情況下逐頁請求數據的數據,大多數數據庫(至少Oracle)不保證任何排序。因此,如果向數據庫發出兩個請求,則可能在第1頁和第2頁中有相同的項目。如果多個項目具有相同的值(例如相同日期),則會發生同樣的問題。數據庫不保證具有相同值的元素之間的任何順序。如果是這種情況,那麼我會建議使用PK作爲最後的命令標準來排序(例如ORDER BY date, PK),以便以一致的方式完成尋呼。

注3:我講的是客戶端和服務器,但是您可以根據自己的具體情況調整想法。

1

如果您對GUI中的部分結果和服務器上的頁面進行排序,用戶會感到困惑。

由於數據集非常龐大,因此將整個數據集發送給用戶並進行分頁和排序都是不可行的。

這隻會在服務器上留下排序和分頁。您可以使用Criteria.addOrder()在休眠中進行排序。見this tutorial

3
  1. 總是有一個排序列。默認情況下,它可以通過「名稱」或「ID」
  2. 使用服務器端分頁。即傳遞當前頁面索引並獲取適當的數據子集。
  3. 在提取標準/查詢中使用排序列。如果客戶端未選擇任何內容,請使用默認值。

因此,您將擁有自己想要的行爲而不需要權衡。

+0

但是,然後數據庫會反覆排序相同的數據,每次請求一個頁面,不是? – ewernli 2009-12-17 10:01:35