gpt4 book ai didi

java - 分页多个存储库

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:24 25 4
gpt4 key购买 nike

我有两个类: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 operation) .但是如果你的数据库提供了一个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
}
}

关于java - 分页多个存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54723060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com