Mybatis-PageHelper 带有ResultHandler参数的查询时会出现异常

fhg3lkii  于 2021-11-27  发布在  Java
关注(0)|答案(1)|浏览(419)
  • 我已在 issues 搜索类似问题,并且不存在相同的问题.

异常模板

使用环境

  • PageHelper 版本: 5.1.10(所有版本)
分页参数
PageHelper.startPage(1,5).doSelectPage(()->sqlSessionTemplate.select("statement", handler));
或者
PageHelper.startPage(1,5).doSelectPage(()->xxxMapper.select(handler));
在使用分页时 并执行带有ResultHandler参数的查询时会出现异常,原因在于mybatis带handler参数查询时不会有返回结果
而在com.github.pagehelper.util.ExecutorUtil中 执行count查询后 会直接使用返回的list中的第一条数据 
//执行 count 查询
        Object countResultList = executor.query(countMs, parameter, RowBounds.DEFAULT, resultHandler, countKey, countBoundSql);
        Long count = (Long) ((List) countResultList).get(0);
最终导致数组越界异常

完整异常信息

Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:653)
	at java.util.ArrayList.get(ArrayList.java:429)
	at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:139)
	at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:150)
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:97)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy160.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.select(DefaultSqlSession.java:169)
	... 82 common frames omitted

功能建议

建议在Long count = (Long) ((List) countResultList).get(0); 判断一下countResultList的长度

xxhby3vn

xxhby3vn1#

由于以上原因建议 : 在使用ResultHandler参数的查询时 handler肯定是用来处理info数据 而不是count数据 所以建议在
com.github.pagehelper.PageInterceptor#intercept中的
//查询总数
Long count = count(executor, ms, parameter, rowBounds, resultHandler, boundSql);
这里 直接使用count(executor, ms, parameter, rowBounds, null, boundSql)进行查询
避免handler逻辑处理count数据报错

相关问题