java - 分页多个存储库
问题描述
我有两个类: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()
return[7,8,9]
和repoB.findAll()
return [1, 100]
,结果[7,8,9,1,100]
将无法正确排序。您需要的解决方案取决于您的数据源(数据库)是否支持 UNION 运算符
使用工会
JPA 不能这样做(联合操作)。但是如果您的数据库提供了一个union
运算符(例如:SQL 或 mongoDB),您可以使用它根据排序获取记录的 id,然后通过 JPA 按 ids 获取记录。
没有工会
如果您的数据库不提供,为此,您将需要创建第三个存储库,它必须从考虑 a 加载 50 个项目,从repoA
考虑a加载 50 个项目,然后对其中的 100 个进行排序(使用合并排序应该很快您可以在 50 处停止算法)。aOffset
repoB
bOffset
代码看起来像这样
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
}
}
推荐阅读
- pdf - 标记顺序与阅读顺序 - 使用 Adobe Acrobat Pro 的 PDF 标记
- django - 替代 django 模板中的范围函数。TemplateSyntaxError:无法解析剩余部分
- html - 在制作这个模型时需要帮助
- python - python inside()中的查询结果并将其转换为整数?
- python - 在 PyCharm 中配置 Flask 应用程序的调试器:“UnicodeDecodeError: 'utf-8' codec can't decode byte”
- php - 在 Drupal-7 中将 entityform 字段数据传递给 API
- google-bigquery - 相对于 BigQuery 中的另一个数组列对一个数组列进行排序
- .net-core - Octopus Deploy 中特定于环境的配置
- php - 在 Wordpress 中删除 404 状态
- c++ - 我什么时候会在基类中默认(而不是删除)复制和移动操作