2014-02-18 15 views
3

我正在開發一個帶有MySQL數據庫的EJB3 java應用程序的檢票前端。該網站主要是提交表格和顯示錶格。對於這些表,我更喜歡創建與AjaxPagingNavigation非常好的IDataProviders。但是我有一些非常大的表,IDataProvider的大小函數實現起來有點棘手。通常我使用查詢計數,這在大多數情況下表現良好,但我有一些大型表,其中計數需要很長時間(3s +)。現在有幾個選擇我可以使用,但我並不是很高興使用其中的任何一個,所以這就是爲什麼我問,有沒有人知道爲大表實現size()函數的優雅解決方案?用於大型表格的Java wicket dataprovider大小爲

我在Google上發現的第一個選項是使用帶有限制結果的子查詢執行計數。但是因爲我主要使用命名查詢和EJB3,所以感覺很詭異,而且如果事情發生變化,可能很難維護。

第二個選擇是使用ListDataView,只是對錶進行有限查詢並省略大計數查詢的需要。這個解決方案是我迄今最喜歡的,但並不是最好的,因爲它(幾乎)總是獲得最大量的記錄。我還必須在存儲這個List對象或在請求之間再次查詢數據庫之間進行選擇。

我發現的最後一個選項是欺騙大小選項。我沒有實現這一點,但我可以使IDataProvider的size()函數返回類似pagesize + 1的內容。這帶來了一些其他問題,例如擁有一定數量的記錄。有檢查,以捕獲這些,但這也是混亂。

有人知道一個優雅的解決方案,在檢票中使用IDataProvider來顯示大型數據庫表的分頁表嗎?

非常感謝,馬丁

回答

1

我已經實現與數據提供商需要唯一的迭代,網格視圖沒有大小的信息 - 其所謂IterableGridView

下面是代碼:基於Wicket的GridViewhttps://github.com/maciejmiklas/cyclop/tree/master/cyclop-wicket-components

可迭代網格視圖,但它不適用於IDataProvider,但 IterableDataProvider。這個新的數據提供者只依賴普通的java迭代器 - 不需要大小信息,也不需要爲每個頁面創建範圍迭代器。

final List<String> myGridData = new ArrayList<>(); 
myGridData.add("value 1"); 
myGridData.add("value 2"); 

IterableDataProvider<String> iterableDataProvider = new IterableDataProvider<String>(10) { 
    @Override 
    protected Iterator<String> iterator() { 
     return myGridData.iterator(); 
    } 

    @Override 
    public IModel<String> model(String s) { 
     return Model.of(s); 
    } 

    @Override 
    public void detach() { 
    } 
}; 

IterableGridView<String> myGrid = new IterableGridView<String>("myGrid", iterableDataProvider) { 
    @Override 
    protected void populateEmptyItem(Item<String> item) { 
     item.add(new Label("myValue")); 
    } 

    @Override 
    protected void populateItem(Item<String> item) { 
     item.add(new Label("myValue", item.getModelObject())); 
    } 
}; 

add(myGrid); 

myGrid.setItemsPerPage(10); 

// you have to use custom pager and not AjaxPagingNavigator 
IterablePagingNavigator pager = new IterablePagingNavigator("rowNamesListPager", rowNamesList); 
resultTable.add(pager); 
0

什麼關於分頁完全放棄並實施quickviewinfinite scrollingsize的問題將被避免,列表的使用將更加自然。

+0

感謝您的回覆!我已經看過它,並且在第一個鏈接的文章中提到了一些問題。例如,當轉到帶有動態加載內容的頁面時,返回不起作用。不過謝謝你的提示,無論如何,我可能會是一個更好的解決方案。 – Martin

0

我用「原始」的家庭對象IDataProvider,似乎是不錯的 - 我自己的層上JDBC,有兩個重要的特點:

  • 自動神奇地執行select [跳過列]計數(*)...哪裏...在檢票口的大小()方法

  • 執行準備MSSQL查詢下迭代器()(在人備感),其中服務器 沒有限制/偏置(在舊版本),我用常用的伎倆與ROW_NUMBER()

第二個是不是在你的情況」很重要,因爲MySQL有LIMIT/OFFSET

代碼是醜陋的,具體到我的合併對象等,但工作,所以是閉源)進行查詢時一種帶有字符串替換的「標準」,兩次使用相同的標準。