mybatis分页造成total遇到过的问题

5 篇文章 0 订阅
3 篇文章 0 订阅

之前在做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);
 }
  1. 上面都用到了Hutool工具的方法,其实也就是对List进行subList 截取

总结

以上都是亲测可用的 ,其核心都是将数据库查询的分页信息进行复制给新的list,表达不清楚可直接看代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值