• 使用PageHelper插件获取数据总条数不对的问题的解决方案


    PageHelper 这个插件用了很多次了,今天使用的时候才发现中间有一个大坑,就是使用这个插件中间只能有一次查询的操作语句,不能再添加其它语句(两行代码之间不能再有其他代码)!

    例如,我们一般都是这样进行查询:

    //创建一个PageResult对象出来
    PageResult<AdvertInfo> pageResult = new PageResult<>();
    
    //开启分页,pageNum代表当前页数,pageSize代表每页总数
    PageHelper.startPage(pageNum, pageSize);
    
    //查询数据库的语句,pageHelper在这里做一次拦截器操作
    List<AdvertInfo> advertList = advertMapper.getAdvertList(advertInfoParam);
    
    //使用PageInfo包装结果
    PageInfo<AdvertInfo> pageInfo = new PageInfo<>(advertList);
    

    上述操作是这样的,但是如果我们需要将查询的 List<AdvertInfo>转换成前端展示的 ViewObject 对象,那么我们想当然会在中间做一次操作:

    PageHelper.startPage(pageNum, pageSize);
    
    List<AdvertInfo> advertList = advertMapper.getAdvertList(advertInfoParam);
    
    //将AdvertInfo某些字段要隐藏,不在前台展示,所以需要转换成前端需要的bean对象
    List<AdvertInfoVO> AdvertInfoList = new ArrayList<>();
    
    for (AdvertInfo info : pageInfo.getList()) {
    
        res.add(convertAdvertInfoToVO(info));
    }
    
    //然后再包装一下前端对象
    PageInfo<AdvertInfoVO> pageInfo = new PageInfo<>(AdvertInfoList);

    这样获取的 pageInfo.getTotal()一直是当前的 pageSize总数,而不是查询的总条数。所以,我们最好不要在 pageHelper 两个语句中间插入其它语句,而是在后面做一些操作:

    //分页查询
    PageHelper.startPage(pageNum, pageSize);
    
    List<AdvertInfo> advertList = advertMapper.getAdvertList(advertInfoParam);
    
    PageInfo<AdvertInfo> pageInfo = new PageInfo<>(advertList);
    
    //转换成前端VO
    List<AdvertInfoVO> advertInfoList = new ArrayList<>();
    
    for (AdvertInfoinfo : pageInfo.getList()) {
    
        advertInfoList.add(convertAdvertInfoToVO(info));
    
    }
    
    //那么这样就可以正确返回了!
    return new LayuiTableResult(0, "查询成功", pageInfo.getTotal(), advertInfoList);
    
  • 相关阅读:
    Java:类加载器(ClassLoader)
    Java 并发:Executor
    Java 并发:线程中断-interrupt
    UNIX IPC: POSIX 消息队列 与 信号
    Java与C++区别:重载(Overloading)
    UNIX IPC: POSIX 消息队列
    PAT 1078. Hashing
    PAT 1032. Sharing
    回顾经典问题算法:LIS, LCS-(DP类别)
    url编码模块
  • 原文地址:https://www.cnblogs.com/no8g/p/13415542.html
Copyright © 2020-2023  润新知