PageHelper分页后,对list操作会导致分页无效

198 阅读1分钟
PageHelper.startPage(pageNum, pageSize);
List<User> userList = userDao.getAllUsers(); 
userList.stream().map()
PageInfo<User> pageInfo = new PageInfo<>(userList);

如果在分页查询之后对结果进行任何额外的操作(如 userList.stream().map()),会导致 PageHelper 无法正确统计总记录数和限制查询结果的大小,从而影响分页的准确性。

问题处理说明
pageHelper中调用数据库查询返回的集合信息,实际上返回的是page类型的集合(继承ArrayList).看pageHelper源码就能发现

public class Page<E> extends ArrayList<E> implements Closeable {
    private static final long serialVersionUID = 1L;
   // 省略属性方法
    }

对比其他分页查询接口发现会员卡查询接口中返回的会员卡列表集合的数据类型为ArrayList,非Page集合.然后看到业务实现层中查询数据库之后有使用stream对集合进行处理,处理之后返回的数据类型为ArrayList,也就是失效的原因.

public List<StaffCardInfoVo> findStaffCardList(StaffCardQueryDto staffCardQueryDto) {

      	// 数据库查询会员卡,此时返回的staffCardList还是page集合类型
        List<StaffCardInfoVo> staffCardList = staffCardMapper.findStaffCardList(staffCardQueryDto, Integer.valueOf(manageUserService.getStudioIdByToken()));
        
 staffCardList= staffCardList.stream().map(
                    staffCardInfoVo -> {
                      // 会员卡字段处理业务       
                        return staffCardInfoVo;
                    }
        ).collect(Collectors.toList());
        // 此处返回的会员卡数据类型为ArrayList
        return staffCardList;
    }

处理方案就是使用for循环替代stream遍历处理.这里仅提供思路不提供具体实现.