起因
同事有一个分页查询接口,发现总条目数查询不正确。其原因是对查询数据列表二次处理时造成信息丢失
根本原因
PageHelper使用了MyBatis
拦截器功能实现,查询时会将数据重新封装成自定义类型page
封装,并由其传输分页信息。
Page
类型继承自ArrayList
,平时查询后会用List
接口类型接收数据;所以了解不深的人,不会发现这个类型,一般正常使用时,会直接将这个Page
交给PageInfo
的构造方法进行初始化并返回
简而言之,就是返回的List
的真实类型,是含有更多信息的PageHelper的自定义类型Page
在不知情的条件下,如果进行二次封装,很容易就把数据给搞丢了
排查过程
需要带着目的去找:何时将错误的total
值写入PageInfo
中
首先找到total
成员
发现其存在于PageInfo
的父类中,它们具有继承关系
此时就很容易的能理解了,写total
值,由于在PageInfo
类中不存在写total
的代码,那么肯定是在PageInfo
调用其父类的方法或构造方法中
解决方案
知道了原因以后就很简单了,同事的处理方式是:
在二次处理时,直接构造了新的Page对象,用复制属性的方法,将丢失的属性拷贝进需要返回的Page集合中
虽然这样的处理会造成一定的代码侵入性,不过也不是不行