MyBatisPlus分页查询限制500条

问题起因

近期在配合前端大哥产出项目的时候遇到了这样一个问题:

  • 前端大哥:请求分页给你传 pageNum=1,pageSize=99999。你给我把所有数据全都捞出来。
  • 我:小意思,ok!
  • …十分钟后…
  • 前端大哥:不对啊,项目中怎么我查询不到我刚添加的内容啊???
  • 我:wc!!!???(我 carry !!!???)
  • 进行排查,现在pageSize为99999,捞出数据库所有数据,我直接对我操作的表一个select count(*),哎~只有570条记录。不应该啊,查这个数据不是绰绰有余?debug一看,坏了这个分页怎么只查出500条,XXOO!

如图所示:
在这里插入图片描述
这不就开始找问题了嘛,有度娘问度娘!有GPT问GPT!

排查问题

  • 为什么没有查询到刚刚添加的内容呢?
  • 因为刚刚插入的排序在最后面,分页查询查询了前500条。所以现在需要让传入的pageSize生效。
  • 什么东西会去限制哥们刚刚new出来的新鲜Page对象呢?
  • 经过我询问过度娘之后,发现是这货《PaginationInterceptor》拦截器!在配置文件配制了这哥们之后,它就把分页默认限制在500条了。给兄弟们看看源码~
package com.baomidou.mybatisplus.extension.plugins;

...省略导入包的内容...太长了,感兴趣的兄弟们可以去苞米豆里看看这个拦截器

/**
 1. 分页拦截器
 2. @author hubin
 3. @since 2016-01-23
 */
@Setter
@Accessors(chain = true)
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class PaginationInterceptor extends AbstractSqlParserHandler implements Interceptor {
	 /**
     * 单页限制 500 条,小于 0 如 -1 不受限制
     */
    protected long limit = 500L;

	@Override
    public Object intercept(Invocation invocation) throws Throwable {
        ......兄弟们估计不爱看这些花里胡哨的,主要是下面这个方法..其他省略......
        
		/*
         * 不需要分页的场合,如果 size 小于 0 返回结果集
         */
        if (null == page || page.getSize() < 0) {
            return invocation.proceed();
        }

        if (this.limit > 0 && this.limit <= page.getSize()) {
            //处理单页条数限制 超过就给size设置limit的值
            handlerLimit(page);
        }

        ......兄弟们估计不爱看这些花里胡哨的,主要是上面这个两个if语句..其他省略......
    }
    
    /**
     * 处理超出分页条数限制,默认归为限制数
     *
     * @param page IPage
     */
    protected void handlerLimit(IPage<?> page) {
        page.setSize(this.limit);
    }
}

解决方法

看了上面的方法,了解到当满足null == page || page.getSize() < 0这个条件的时候就不去搞分页操作了。那山人就有了方法A这条妙计了。那么有张良计就有过墙梯,还有一个B方法,就是当我设置page对象的size超过limit的时候,把limit的值赋值给size,如果limit=500,size=570,那就设置size = limit = 500;我给这个limit数据拉大不就好了。

解决方法A

新new出Page这个对象之后,它是不为空的,那我只需要设置page对象的size小于0,只要小于0,那就不会分页。代码如下

@Override
    public IPage<UserInfo> getAllUserInfo(Integer pageNum, Integer pageSize) {
        LambdaQueryWrapper<UserInfo> userWrapper = new LambdaQueryWrapper<>();
        userWrapper.eq(UserInfo::getDisable,0);
        //*******实际就是以下代码**********
        Page<UserInfo> userPage = new Page<>(pageNum, -1);
        //*******实际就是以上代码**********
        Page<UserInfo> pageResult = userInfoMapper.selectPage(userPage,userWrapper);
        return pageResult;
    }

如图所示:
在这里插入图片描述

解决方法B

从PaginationInterceptor拦截器入手,你小子不是默认限制500条嘛,还不能超过你,超过你,你就把我的值给覆盖了。我给你拦截器的limit按照我的需求设置。✌给你limit设置给1000,我要570,570<1000,你给我把我需要的数据都传出来。代码如下:

//写一个配置类 并将其注册到spring容器中 然后给拦截器自定义我们需要的limit值
@Configuration
public class MyBatisPlusConfig {

    @Bean
    public PaginationInterceptor mybatisPlusInterceptor(){
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        paginationInterceptor.setLimit(1000);
        return paginationInterceptor;
    }
}

结果如图:
在这里插入图片描述

大体总结:要么 new Page<>(pageNum,PageSize);的时候给pageSize设置负值,要么给拦截器PaginationInterceptor 自定义设置合适的limit。

这样问题就解决了,若有问题可以与我交流,谢谢阅读!

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值