2016-01-12 42 views
0

我在 https://vaadin.com/wiki/-/wiki/Main/Lazy%20Query%20Container/Vaadin網格和LazyQueryContainer

連接的懶惰查詢容器到Vaadin網格由以下的實施例中的那些實施例中所需要的查詢實現爲具有 @覆蓋公共INT尺寸()方法。看起來像,網格使用此方法來獲取當設置容器時將顯示的對象總數。

Size方法需要計數和全表掃描,在我們的例子中這是非常昂貴的。

而不是立即設置大小,我們希望在每個loadItems調用「@Override public List loadItems(int startIndex,int count)」中更改/更新它。

通知容器(以及最終使用該容器的網格)關於最新已知大小的最佳方式是什麼?

有沒有任何設置懶惰大小的例子?

預先感謝您。

+0

我個人還沒有使用它,但我懷疑是必需的_pagination_大小。在不知道數據庫中有多少項目的情況下,很難找出在'public List loadItems(int startIndex,int count)期間加載哪個塊' – Morfic

+0

是否推遲大小估計到loadItems調用可以幫助你?無論如何,在第一個渲染中,這種UI模式需要大小。如果您無法優化計數查詢,我只需回到UI級別的「傳統分頁」。一些使用(對於這個通用的問題)一個單獨的表和SQL觸發器。 – mstahv

+0

謝謝你的回覆。這是我所嘗試過的,到目前爲止它沒有工作: 我將LazyContainer Size設置爲Integer.MAX_VALUE。每個loadItems方法調用將從數據庫中查詢所請求的時間間隔,如果它不是最後一個頁面,它將保持大小爲整數max。如果它是最後一頁,它將爲容器設置正確的大小。 所以,容器本身看起來像工作。但是,網格僅在容器初始分配給網格時才檢查大小。並且從不在loadItems方法調用之前或之後再次查詢大小。它始終假定大小相同。 – turgos

回答

1

我有一個用小「緩存」和Spring Data Solr編寫的解決方案。在這種情況下,請求僅在需要時傳遞。您可以根據自己的目的進行擴展或更改。

SolrLazyQuery (Pagination) mit Vaadin Grid und Spring Data Solr

final LazyPagedContainer<T> container = new LazyPagedContainer<>(this.currentGenericClass); 
container.setLazyQuery(new LazyContainerQuery<T>(firstPage) { 

    @Override 
    protected Page<T> getPageByNumber(final int pageNumber) { 
     final SolrPageRequest solrPage = new SolrPageRequest(pageNumber, PAGE_SIZE, MyGrid.this.currentSort); 
     return MyGrid.this.search(solrPage, MyGrid.this.currentSearch, MyGrid.this.currentFilterValues); 
    } 
}); 

Vaadin Grid/Table requests to this query: 
startIndex: 0, numberOfIds: 95 
startIndex: 0, numberOfIds: 139 
startIndex: 52, numberOfIds: 171 
startIndex: 137, numberOfIds: 171 
[...] 

Requests to Solr: 
start: 0 rows: 100 
start: 100 rows: 100 
start: 200 rows: 100 
start: 300 rows: 100 
[...] 
+0

謝謝亞歷山大的回覆。我會在幾天內嘗試並分享結果。 – turgos