2016-05-12 6 views
1

Primefaces PAGINATEレイジーのDataTable

    ... 
        private LazyDataModel list; 
        ...      
        public void search() { 
         list = new LazyDataModel<SomeDTO>() { 
          private static final long serialVersionUID = 1L; 
          List<SomeDTO> result = null; 

          @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           // SOME CODE HERE FOR PAGINATION ?? BUT WHAT 
           return result; 
          } 

         }; 
         // HOW TO DELETE THIS EXTRA REQUEST 
         list.setRowCount(service.search(searchedName)); 
        } 

私の質問は、結果(サイズ+ 1)からsetRowCountする方法です。 DBからカウントを取得したくないのは、私はDBを要求せずにrowCountを計算できると確信しているからです。

答えて

-1

よろしいですか。 あなたのページの最初のあなたは、この必要があります。

      @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           if (first <= pageSize) { 
            this.setRowCount(this.getRowCount() + result.size() + 1); 
           } else if (result != null && result.size() > 0 && (result.size() >= pageSize)) { 
            this.setRowCount(this.getRowCount() + result.size()); 
           } 
           return result; 
          } 
+0

これは、データテーブルを更新します。二度。クエリは2回実行されます...あなたが思うと思うものではありません。 – Kukeltje

+0

いいえすべてのことを知っている、問題を解読し、解決策を提供する前にpersones.apparentlyあなたがプライムフェイスdatatable怠惰なロードを知っていないとどのように動作します! –

+0

まず第一に、私は人を判断していない、私は答えを判断しています。技術的にはうまくいくかもしれませんが、効率的なソリューションではありません。あなたは答えを読むことについてはっきり言っています。 **私は、「受け入れられた」PrimeFacesパッチを作成した人ですが、気付いたのですか?**私は、フォーラムや古いissuelistのPrimeFacesデータテーブルのために、リピート。私は私の環境で長時間働いているので、**私は**遅延読み込み**を知っています。ですから、人を判断する前にレコードを真っ直ぐにしてください** – Kukeltje

-1

PrimefacesページネーションレイジーのDataTableに必要な2つのクエリ、ページの結果を返すようにクエリ:あなたの豆で

    <p:remoteCommand name="updateMyTable" update="#{p:component('myTable')}" process="@this" /> 
        <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="updateMyTable()" /> 
        ... 
        </p:dataTable> 

を、このような負荷方法を変更データの合計サイズを知るためのもう1つのクエリが含まれています。

+1

2つのクエリは不要です。我々のサービスで返されるリストのサイズから動的に、 このソリューションの利点は、特に非常に複雑な検索クエリのために、dbから数えるためにサービスメソッドを複製する必要がないということです。 –

2

PrimeFacesはこれをそのまま受け入れていませんでした。 A fix has been checked in to trunk on Feb 11th 2016, tagged 6.0(少なくとも現在の6.0RCxリリースにあるはずです)。 Eliteリリース> = 5.2.20または> = 5.3.7(2月12日から)

これが機能しない1つの重要な理由の1つは、ロード時に更新された行カウントメソッドserversideはではなく、がページネータークライアント側に適用されます。ただし、はサーバーからクライアントに転送されるため、各ajax呼び出しの完了時に更新することができます。実際には、それはpatchの大きな部分です(もう1つの部分はajaxレスポンスの値を読み取っています)。

ページサイズ+ 1つの記録 を読むようにしてください - - あなたが読むことができるならばこれに回数を設定

function updatePaginator(xhr, status, args) { 
    var paginator = PF('DataTableWidgetVar').paginator; 
    paginator.cfg.rowCount=args.totalRecords; 
    paginator.cfg.pageCount = Math.ceil(value/paginator.cfg/rows)||1; 
    paginator.updateUI(); 
} 

あなたはその後、loadメソッドの各呼び出しで、 ことができます:AjaxのページイベントのonCompleteの問題を解決しますpageSize + 1(ただし、pageSizeレコードを返す) - pageSize以下であれば、読み込んだ行数にカウントを設定します。

+0

あなたが私のソリューションを見ているなら、私は以下を持っています:このコマンドはajaxページ。私はそれをテストし、それは完全に動作します。あなたの答えに確信がない場合は投稿してください。 –

+0

p:ajaxページイベント用とp:remoteCommand用のリクエストがあります。これは問題ではありません。問題は、データベースにdatatableではないカウント行を要求することを避けます。 –

+0

これはpの別の問題です:remoteCommand datatableの負荷が2回実行されます.. pなしでデータテーブルを更新する方法を知っていますか?remoteCommand私はupdate = "datatable"を試みましたが、動作しませんでしたか? –

関連する問題