【Springboot】解决PageHelper在实体转Vo下出现total数据问题

文章目录

问题描述

实体对象查询完成后转为Vo对象,出现返回的分页参数中total数据是实际返回数据条数,而不是分页的总数

解决方案

建立一个ThreadLocal存储正确的total数据

java 复制代码
import com.github.pagehelper.PageHelper;
import com.platform.common.core.page.PageDomain;
import com.platform.common.core.page.TableSupport;
import com.platform.common.utils.sql.SqlUtil;

/**
 * 分页工具类
 */
public class PageUtils extends PageHelper {

    // pageHelper失效时使用
    public static final ThreadLocal<Long> PAGE_TOTAL = new ThreadLocal<>();

    /**
     * 设置请求分页数据
     */
    public static void startPage() {
        PAGE_TOTAL.remove();
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {;
        PAGE_TOTAL.remove();
        PageHelper.clearPage();
    }

    /**
     * 设置页面总计
     */
    public static void setPageTotal(Object mybatisObj) {
        com.github.pagehelper.Page pageObj = (com.github.pagehelper.Page) mybatisObj;
        PAGE_TOTAL.set(pageObj.getTotal());
    }
}

封装对象

java 复制代码
// 示例Ruoyi中的封装对象
protected TableDataInfo getDataTable(List<?> list)
{
    TableDataInfo rspData = new TableDataInfo();
    rspData.setCode(HttpStatus.SUCCESS);
    rspData.setMsg("查询成功");
    rspData.setRows(list);
    // 此处判断是否存在手动设置的PAGE_TOTAL
    Long total = PageUtils.PAGE_TOTAL.get();
    if(ObjectUtils.isEmpty(total)){
        rspData.setTotal(new PageInfo(list).getTotal());
    }else{
        rspData.setTotal(total);
    }
    return rspData;
}
相关推荐
小码哥_常3 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨8 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠8 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel9 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放9 小时前
Python基础语法练习题(73)
java·前端·python