之前在做springBoot+mybatis的时候,遇到分页的问题一直困扰我最后还是别人解答出来告诉我的,先开始分页查询,然后查询出来之后我又循环组织数据添加到另一个List去然后开始返回。这里就破坏了原来分页查询出来的分页参数。
我找到两种解决办法:
1. 第一种解决办法
public PageInfo<UserFromVO> listUser(User user, CommonQo commonQo) {
//开始分页
PageHelper.startPage(commonQo.getPageNum(), commonQo.getPageSize());
//找到第一个mapper查询
List<User> list = userServiceMapper.findList(user);
//进行设置分页参数
PageInfo<User> pageInfo = new PageInfo<>(list);
//循环遍历新的list
List<UserFromVO> voList = new ArrayList();
for(User u : list) {
if(u.type==1) {
***
voList.add
}
}
//对新的list进行分页参数
PageInfo<UserFromVO> page= new PageInfo<>(volist);
//最主要就是这一步,直接复制分页所有参数到另一个list
BeanUtils.copyProperties(pageInfo,page);
return page;
这种如果遇到for循环的时候进行筛选的话 应该会出现问题的,比如一页条数10条而显示的却只有9条。
主要是用了 BeanUtils.copyProperties(pageInfo,page);复制分页属性
第二种解决办法
//targets 是mapper查询的list
//results 是返回新的list
List<xx> targets=mapper.findList 查询
List<xx> results=new ArrayList<>();
if(targets instanceof Page) {
//转换Page分页对象
results=new Page<>();
//也转换分页对象
Page target=(Page)targets;
//将返回的list转换为对应的泛型
Page<SensitivePerson> page=(Page<SensitivePerson>)results;
//接下来就是一个一个单独set
page.setTotal(target.getTotal());
page.setEndRow(target.getEndRow());
page.setStartRow(target.getStartRow());
page.setPageSize(target.getPageSize());
page.setPageNum(target.getPageNum());
page.setPages(target.getPages());
}
for循环.....
第二个有个地方要注意,就是挨个设置分页参数是在返回list为空的时候,就是还没循环放值.
第三种解决办法
@Override
public PageInfo<HdQueryVo> getRecordsByView(int pageNo, int pageSize) {
PageInfo<HdQueryVo> source = PageHelper.startPage(pageNo, pageSize).doSelectPageInfo(()->{
actionMapper.getActionByView();
});
// 需要转换的对象
PageInfo<HdQueryVo> target = new PageInfo<>();
// 复制分页属性
BeanUtils.copyProperties(source, target);
// 对查询的list进行下一步操作,比如类型转换后
List<HdQueryVo> collect = source.getList().stream().collect(Collectors.toList());
List<HdQueryVo> hdQueryVos = new ArrayList<>();
for (HdQueryVo hdQueryVo : collect) {
.......
hdQueryVos.add(hdQueryVoSingle);
}
// 加工后的数据放入新的pageinfo
target.setList(hdQueryVos);
return target;
}
直接对分页后的PageInfo对象中的数据进行操作
对list集合操作,先取出PageInfo里的list集合数据,再对数据进行相关操作
将操作完后的list集合再次存到PageInfo里,进行return
List分页
因为一些业务场景不得不对查询出来的数据进行筛选,那么极有可能造成分页失效或造成total异常。
返回vo:
@Data
@Accessors(chain = true)
@ApiModel(value = "分页数据", description = "分页")
public class MeetingListPage {
@ApiModelProperty("当前页码")
private Integer currPage;
@ApiModelProperty("页大小")
private Integer pageSize;
@ApiModelProperty("总数量")
private Integer totalCount;
@ApiModelProperty(value = "数据")
private List<MeetingListVo> list;
}
Controller:
@ApiOperation("会商决策中心-会议列表")
@PreAuthorize("@ss.hasPermi('auxiliary:meeting:list')")
@GetMapping("/list")
public Result<MeetingListPage> list(@RequestParam(value = "currPage", defaultValue = "0") Integer currPage,
@RequestParam(value = "pageSize" , defaultValue = "10") Integer pageSize ) {
MeetingListPage resultList = zfxtMeetingService.selectZfxtMeList(currPage, pageSize);
return ResultGenerator.genSuccessResult(resultList);
}
Servise:
@Override
public MeetingListPage selectZfxtMeList(Integer currPage, Integer pageSize) {
....省去中间的业务
List<ZfxtMeeting> zfxtList = zfxtMeetingMapper.selectZfxtList(data);
//使用迭代器筛选remove
for (Iterator<ZfxtMeeting> iterator = zfxtList.iterator(); iterator.hasNext();) {
....
//筛选条件 管理员和维稳处可以查看全部人员 如果是街道办那么就只能看见自己参议的会议
Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
if (!SecurityUtils.isRoleKey(IS_WWC) && !userIds.contains(userId)) {
iterator.remove();
}
}
//开始分页
Integer pageIndex;
if (currPage == null) {
pageIndex = 0;
} else {
pageIndex = Math.max(currPage - 1, 0);
}
List<MeetingListVo> pageList = CollUtil.page(pageIndex, pageSize, zfxtList );
return new MeetingListPage().setCurrPage(currPage).setPageSize(pageSize).setTotalCount(result.size()).setList(pageList);
}
- 上面都用到了Hutool工具的方法,其实也就是对List进行subList 截取
总结
以上都是亲测可用的 ,其核心都是将数据库查询的分页信息进行复制给新的list,表达不清楚可直接看代码