- 本地调试一个方法,模拟分页参数为
,出现奇怪的现象
分页插件使用threadlocal保存当前的分页参数并在调用查询的时候先count一次,此问题现象为count的时候是有1条数据的,但是返回的list结果集却没有数据并且没有打印执行select list的sql语句,好奇怪啊,按道理是两者的数据量肯定是一样的 并且要执行2次sql查询
-
于是进入debug查看,首先进入到executeForMany方法
-
接着进入selectList方法
-
继续进入Plugin的invoke方法
-
接着进入pageinterceptor的intercept方法
此方法里面的beforeCount为分页逻辑先count的处理逻辑,执行完成之后count==1,此处还没发现问题
-
进入afterCount方法发现afterCount方法返回值为false
于是程序走到了第77行
并且跳过了执行list查询的关键代码
-
由上面分析可知,要想执行list的查询sql,this.dialect.afterCount代码必须要返回true,即page.getPageNum() > 0 && count > page.getStartRow();必须要返回true,即page.getPageNum()必须要大于0,也就是分页的参数起始页码应该要从1开始而不是0,所以修改分页参数为1后setCurrPage(1),一切正常,bug解决