适用背景
由于项目需求,需查询活动列表名单,并统计活动对应用户数。由于数据库表结构设计,活动基本信息存储在一张小数据量表,活动对应的用户信息存储在大数据量表,直接left join 并SUM的话,性能会急剧下滑,因此采取先拉取活动列表,再循环统计活动用户数的方式。而为了配合新增需求,剔除不满足条件的活动(如用户数为0),再返回前台;需要改变原有limit offset的分页方式,否则会出现分页,total计数不准的情况,查阅资料后发现物理分页包括pageHelper等工具,都是在dao层已经分页并返回,无法适配业务筛选条件。因此改为逻辑内存分页,实现起来的代码也很简单:

public static List rowBounds(int pageNum, int pageSize, List list) {
pageNum = Math.max(pageNum, 0);
// 默认至少返回5行
pageSize = Math.max(pageSize, 5);
int startRow = 0;
int endRow = 0;
if (list == null || list.size() == 0) {
return list;
}
int totalCount = list.size();
startRow = pageNum > 0 ? pageNum * pageSize : 0;
endRow = startRow + pageSize;
endRow = Math.min(endRow, totalCount);
list = list.subList(startRow, endRow);
return list;
}