最近遇到一个问题,在我的项目中页面的分页突然失效了?
通过查看历史的修改发现在我对查询的List进行了操作之后,Total无法正常返回导致分页失效了。
目前有2种解决方案,这里就只讲解最容易理解和书写的。
源代码:
Page<xx> page = new Page<>(curPage, pageSize);
PageHelper.startPage(curPage, pageSize);
//获取list
List<xx> list = sql;
//list操作
list.for..
PageInfo<xx> pageInfo = new PageInfo<>(list);
page.setList(pageInfo.getList());
page.setCount(pageInfo.getTotal());
return page;
修改方案一:对PageInfo中的list进行操作
Page<xx> page = new Page<>(curPage, pageSize);
PageHelper.startPage(curPage, pageSize);
//获取list
List<xx> list = sql;
PageInfo<xx> pageInfo = new PageInfo<>(list);
//list操作
List<xx> info = pageInfo.getList
info.foreach.....
page.setList(pageInfo.getList());
page.setCount(pageInfo.getTotal());
return page;
上述代码中的list与info,并不表示同一个列表,我们之前直接对list进行操作并不会对PageInfo的属性值产生影响所以没有效果,但是对它本身的列表操作是能作用到它本身。
修改方案二:手动分页+设置Total
原本先设定分页参数,现在改为先获取list再进行分页操作:
//获取list
List<xx> list = sql;
//list操作
list.for..
Page<xx> page = new Page<>(curPage, pageSize);
// 内存分页
List<xx> list = list.subList((curPage - 1) * pageSize,
curPage * pageSize > list.size() ? list.size() : curPage * pageSize);
PageInfo<xx> pageInfo = new PageInfo<>(list);
page.setList(pageInfo.getList());
page.setCount(list.size());
return page;
附加:因PageHelper合理化配置默认为ture导致分页可超出最大页数的问题
设置PageHelper参数为false即可
PageHelper.startPage(curPage, pageSize, false);
如果需要全局解决这个问题,这里需要对mybatis的配置进行修改
将PageHelper中"offsetAsPageNum"或者sqlSessionFactory中"reasonable"设置为"false"即可
其他参数可自行查阅文档了解其用途
public class MyBatisConfig {
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper=new PageHelper();
Properties properties=new Properties();
//把这个设置为true,会带RowBounds第一个参数offset当成PageNum使用
properties.setProperty("offsetAsPageNum","true");
//设置为true时,使用RowBounds分页会进行count查询
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
pageHelper.setProperties(properties);
return pageHelper;
}
//自定义方法
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource) {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("returnPageInfo", "check");
properties.setProperty("params", "count=countSql");
pageInterceptor.setProperties(properties);
// 添加插件
bean.setPlugins(new Interceptor[]{pageInterceptor});
// 添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath:mapper/**/*.xml"));
bean.setConfigLocation(resolver.getResource("classpath:mybatis-config.xml"));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}