【Java】PageHelper分页总条数和总页数查询不正确

时间:2024-03-28 15:13:33

起因

同事有一个分页查询接口,发现总条目数查询不正确。其原因是对查询数据列表二次处理时造成信息丢失

根本原因

PageHelper使用了MyBatis拦截器功能实现,查询时会将数据重新封装成自定义类型page封装,并由其传输分页信息。

【Java】PageHelper分页总条数和总页数查询不正确
Page类型继承自ArrayList,平时查询后会用List接口类型接收数据;所以了解不深的人,不会发现这个类型,一般正常使用时,会直接将这个Page交给PageInfo的构造方法进行初始化并返回

简而言之,就是返回的List的真实类型,是含有更多信息的PageHelper的自定义类型Page

在不知情的条件下,如果进行二次封装,很容易就把数据给搞丢了

排查过程

需要带着目的去找:何时将错误的total值写入PageInfo

【Java】PageHelper分页总条数和总页数查询不正确
首先找到total成员
【Java】PageHelper分页总条数和总页数查询不正确
【Java】PageHelper分页总条数和总页数查询不正确
发现其存在于PageInfo的父类中,它们具有继承关系

此时就很容易的能理解了,写total值,由于在PageInfo类中不存在写total的代码,那么肯定是在PageInfo调用其父类的方法或构造方法中
【Java】PageHelper分页总条数和总页数查询不正确
【Java】PageHelper分页总条数和总页数查询不正确

解决方案

知道了原因以后就很简单了,同事的处理方式是:

在二次处理时,直接构造了新的Page对象,用复制属性的方法,将丢失的属性拷贝进需要返回的Page集合中

虽然这样的处理会造成一定的代码侵入性,不过也不是不行