记录springboot利用pagehepler失效的原因

记录springboot利用pagehepler失效的原因

首先说一下记录这个博客的原因吧,之前用SSM的时候,也用过pageHepler,但是一切也OK,后来打算利用springboot搭建项目的时候在数据量小的时候(也就是数据还没有到分页的时候)也没又出现问题,但是当数据量慢慢增多的时候突然发现了一件事,就是每次利用pageHepler发过去的数据,数据其实传的是全部!!!!

吓得我赶紧后台debug了一下,没有任何异常原因,经过查询作者的github项目主页的时候发现那么几个错误解决办法,希望对此有帮助。

pagehepler失效,查询全部数据

这里我的Springboot是2.1.4版本,Mybatis和pageHelper版本在下面

<dependency>
           <groupId>com.github.pagehelper</groupId>
           <artifactId>pagehelper-spring-boot-starter</artifactId>
           <version>1.2.12</version>
       </dependency>

       <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>2.0.1</version>
       </dependency>

在一开始,我查询的博客大多都是说什么版本不对啊,或者没有配置属性啊,这里我澄清一点,版本问题确实有,但是充其量是pagehepler版本太低的问题。而且,版本冲突的时候springboot本身就会报错!还有就是属性问题,根据我的测试,(本人mysql数据库)直接上默认属性就行,根本不需要任何配置。所以说那些博客真的很浪费大家时间。

那么,这个失效的原因在哪里呢。经过反复的排查,发现了作者这句话,就是PageHepler.startstartPage(pageNum,pageSize);这句话,必须要后面紧跟查询语句,不能插任何逻辑语句,这就很蛋疼了,因为我只前利用SSM的时候就直接在函数的开头写上这句话,防止啥时候忘了。 然后加上这句话的时候,返回的数据正常了。。

正当我以为这个问题解决了的时候,随之出现了第二个bug....

pageHepler返回的total不正确

当我兴奋的打开我的网站乱搞的时候,突然发现,数据倒是对了,但是返回值完全对不上,根本就是当前页面的数据总量。吓得我赶紧去翻sql日志,结果日志也显示我已经查询过了。

得,还得去作者主页。。。

经过盘了一下主页发现,原来是我查询完了之后,不想暴露一些关键属性,比如外键啊啥的,就利用lambda得stream进行了一次流操作。具体逻辑在这


// 查询前期操作
        Integer blogger_id = userService.getUserIdByToken(token);

        BlogExample blogExample = new BlogExample();
        BlogExample.Criteria criteria = blogExample.createCriteria();
        criteria.andBloggerIdEqualTo(blogger_id);


        // 开始查询
        PageHelper.startPage(pageNum,pageSize);
        List<BlogWithBLOBs> blogWithBLOBs = blogMapper.selectByExampleWithBLOBs(blogExample);

// 查询到结果并且处理
        blogWithBLOBs =  blogWithBLOBs.stream().map(item->{return new BlogWithBLOBs(item.getId()
                ,item.getStatus(),
                item.getTitle(),
                item.getSummary(),
                item.getReleaseDate(),
                item.getNearestModifyDate(),
                item.getTagTitle(),
                item.getContent(),
                item.getContentMd());}).collect(Collectors.toList());

// page结构化准备分页数据
        PageInfo<BlogWithBLOBs> list = new PageInfo<>(blogWithBLOBs);

        DataGrid dataGrid = new DataGrid();

        dataGrid.setTotal(list.getTotal());

        dataGrid.setRows(list.getList());

但是作者的主页说过这样一句话

lambda会让数据丢失,所以total就返回了默认的当前所有数据,这也就是为什么我们会看到total返回不正确了,这是人家默认的啊!!!

还有一点值得注意的就是,作者说我们返回的查询结果其实也是Page属性,也就是PageHepler.start的那个返回值。

那么现在解决办法就很明显了,我们可以将get的List用一个对象接收,然后对那个对象进行处理。

或者,放弃利用lambda(不可能)

posted @ 2021-01-21 18:14  逝痕枫舞  阅读(274)  评论(0编辑  收藏  举报