代码
第一次是在获取page前就查好想要的,然后再查询单表,对应一致就好
//3、查询-PageHelper带有子集的SQL查询总数映射有问题
//3-1 获取全部用户以及角色
List<SysUser> list1 = sysUserService.getAllUserByConditions(departNames,userName,realName,jobNumber);
PageHelper.startPage(pageNum, pageSize);
List<SysUser> list = sysUserService.getAllUserToPageHelper(departNames,userName,realName,jobNumber);
//3-2 将单表获取的与带角色的匹配,在转移过来
//法一:将list1 中对应的直接全部转为新list覆盖原list
list = list.stream().map(mapper->
list1.stream()
.filter(predicate-> predicate.getUserId() == mapper.getUserId())
.findFirst().orElse(null)
).collect(Collectors.toList());
//法二:将list1 中对应的role集合复制到list的role空集合中
list.forEach(action->{action.setRoles(
list1.stream()
.filter(user-> user.getUserId() == action.getUserId())
.map(user -> user.getRoles()).findFirst().get()
);});
PageInfo<SysUser> pageInfo = new PageInfo<SysUser>(list);
//3-3 总是仍要为全部的,配置后的只显示当前页的条数
pageInfo.setTotal(list1.size());
两种方法,第一种就是讲第二个list中的对象全部转化为第一个list中的数据,第二种是只将对应的数据赋值到对应的数据中,都可以实现,看你心情
注:
PageInfo中的总数依旧有问题,只有当前页数据的总数,显然是不对的,还需在单独修改一下。
总结
这样写毕竟不是在根源解决,PageHelper没有去研究,有哪位大神知道的可以交流一下。
还有对于lamda的使用还是不是很熟练,总感觉会有更好的方式,毕竟这样和两次for循环没啥区别,只是代码简洁一些而已。
补充解决方案:
重写page对象:
/**
* 分页处理
* 目前 前端已处理跳转页超出范围问题,此处不再处理
* @param <T> 泛型对象
* @param pageNum 当前页码
* @param pageSize 每页显示条数
* @param list 全部数据集
* @return
*/
public static <T> PageInfo<T> getPageInfo(int pageNum, int pageSize,List<T> list) {
//1、创建Page类
Page<T> page = new Page<T>(pageNum, pageSize);
//2、为Page类中的total属性赋值
int total = list.size();
page.setTotal(total);
//3、计算当前需要显示的数据下标起始值
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize,total);
//4、从链表中截取需要显示的子链表,并加入到Page
if (total > startIndex) {
page.addAll(list.subList(startIndex,endIndex));
}else {
page.addAll(list);
}
//5、以Page创建PageInfo
PageInfo<T> pageInfo = new PageInfo<T>(page);
return pageInfo;
}
PageInfo<SysUser> pageInfo = PagehelperUtil.getPageInfo(pageNum, pageSize, list);