[英]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.