簡體   English   中英

分頁多個存儲庫

[英]Pagination multiple repositories

我有兩個classess:A,B。對於每個類我都有存儲庫。 我想在一個表中顯示數據(前端,類似於: http//embed.plnkr.co/V06RsBy4a6fShwmZcUEF/ )。 我想要服務器端分頁。

List<Object> result = new ArrayList();
result.addAll(repoA.findAll());
result.addAll(repoB.findAll());

public interface repoAPaginationRepository extends PagingAndSortingRepository<A, Long> {
    Page<A> findAll(Pageable pageRequest);
}

public interface repoAPaginationRepository extends PagingAndSortingRepository<B, Long> {
    Page<B> findAll(Pageable pageRequest);
}

是否足以總結兩個存儲庫的“計數”? 示例:存儲庫A:100個項目,存儲庫B:50個項目。 總和:我想要的150件商品每頁顯示50件商品。

如你所說,計數是正確的。 您需要找到一種正確顯示合並數據的方法。 我們可以看到您的存儲庫對這些類型中的記錄進行排序。 但如果你連接結果,它們將不會被排序。

在您的示例中,假設repoA.findAll()返回[7,8,9]並且repoB.findAll()返回[1, 100] ,結果[7,8,9,1,100]將無法正確排序。 您需要的解決方案取決於您的數據源(數據庫)是否支持UNION運算符

使用工會

JPA不能這樣做(聯合操作) 但是,如果您的數據庫提供了一個union運算符(例如:SQL或mongoDB),您可以使用它來根據排序獲取記錄的ID,然后通過JPA通過ID獲取記錄。

沒有工會

如果您的數據庫沒有提供,要做到這一點,您將需要創建第三個存儲庫,它必須從repoA加載50個項目考慮aOffset和50個來自repoB項目考慮一個bOffset ,然后對其中的100個進行排序(它應該是快速進行合並排序,您可以在50)停止算法。

代碼看起來像這樣

interface RepoA {
  List paginate(int count, int offset, SortCriteria sortCriteria);
}

interface RepoB {
 List paginate(int count, int offset, SortCriteria sortCriteria);
}

class RepoAB {
  private RepoA repoA;
  private repoB repoB;


  List paginate (int count, int offset, SortCriteria sortCriteria) {
     int aOffset = count == 0 ? 0 : calcAOffset(offset, sortCriteria);
     int bOffset = count == 0 ? 0 : offset - aOffset;
     return mergeSort(
             repoA.paginate(count, aOffset),
             repoB.paginate(count, bOffset),
             SortCriteria sortCriteria,
             50
           )
  }

  List mergeSort(List aList, List bList, SortCriteria sortCriteia, int stopAt) {
    ...
  }

  int calcAOffset (int offset, SortCriteria sortCriteria) {
    // This implementation can be very heavy, it will count all the records that
    // that appeared in the previous pages. 
    // You can evade this computation by knowing the offset using the last record 
    // in the previous page.
    return paginate(offset, 0, sortCriteria).filter(x => x instanceOf A).length
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM