JAVA 内存/逻辑分页

@JAVA 内存/逻辑分页

适用背景

由于项目需求,需查询活动列表名单,并统计活动对应用户数。由于数据库表结构设计,活动基本信息存储在一张小数据量表,活动对应的用户信息存储在大数据量表,直接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;
    }

记录一下这份代码,这种场景非常常见,不失为一种解决方法

你可能感兴趣的:(mybatis,java,spring)