• 解决若依框架多次list查询时,分页失效问题


    一、问题背景

    若依框架遇到两次及以上的list查询时,会引发分页查询失效问题,如下图:
    在这里插入图片描述

    二、分析原因

    分页查询原理

           Mybatis的分页原理,大致就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL,然后重写 SQL,实现分页查询。

    分析原因

    若依框架中,使用的是PageHelper分页对象进行分页查询:
           当一次请求涉及到多个list查询时,第一次的list查询会把这个PageHelper分页对象消耗掉,因此后面的查询就无法实现分页查询进而直接查询所有数据.
           当理解了分页原理以及产生上述问题的原因后,解决这个问题不过是信手拈来的事了,具体做法如下:

    三、解决办法

    1. 抽离出若依框架的分页插件工具
    /**
     * FileName: PageUtil
     * Date:     2023.9.23 17:00
     * Description: 分页工具---解决若依框架多次list查询时,分页失效问题
     */
    package com.ncjr.common.core.page;
    
    import com.github.pagehelper.PageHelper;
    import com.ncjr.common.utils.StringUtils;
    import com.ncjr.common.utils.sql.SqlUtil;
    
    /**
     * 分页工具---解决若依框架多次list查询时,分页失效问题
     * @author WuXingZheng
     * @date 2023.9.23
     * @version 1.0.0
     */
    public class PageUtil {
        public static void startPage()
        {
            PageDomain pageDomain = TableSupport.buildPageRequest();
            Integer pageNum = pageDomain.getPageNum();
            Integer pageSize = pageDomain.getPageSize();
            if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
            {
                String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
                PageHelper.startPage(pageNum, pageSize, orderBy);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    1. 在最后一次查询时,才开启分页查询
      控制器调用:
     @GetMapping("/list")
        @ApiOperation("查询XXX产品列表")
        public TableDataInfo list(XXXProduct pro) {
            // startPage();  在控制器中开启分页查询,会导致后续的分页查询失效,因此不能在控制器中开启分页查询
            List<XXXProduct> list =
                    service.selectFinancialLeasingProductList(pro);
            return getDataTable(list);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    具体实现:

      @Override
        public List<XXXProduct> selectXXXProductList(XXXProduct product) {
            List<String> organizeIds = utilService.getCurrentUserOrganizeIds();
            //最后一次list查询时,才开启分页数据查询,防止分页实失效
            PageUtil.startPage();
            
            List<XXXProduct> list = mapper.selectXXXProductList(organizeIds,
                    product);
            return list;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    让你起飞的Linux进阶操作
    iOS支付时出现Unknow错误的问题
    SpringCloud原理-OpenFeign篇(三、FeignClient的动态代理原理)
    C++模板类中定义友元模板函数问题
    前后端分离项目(九):实现"添加"功能(后端接口)
    11.5MyBatis(进阶)
    车载通信架构 —— DDS协议介绍
    1. 英文SCI论文引言写作四步走模型学习笔记
    函数的节流和防抖?节流和防抖的区别及实现
    浅梳理JS对字符串的操作
  • 原文地址:https://blog.csdn.net/qq_37844454/article/details/133635642