Page分页失效的问题以及解决方案

最近遇到一个问题,在我的项目中页面的分页突然失效了?

通过查看历史的修改发现在我对查询的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;

 上述代码中的listinfo,并不表示同一个列表,我们之前直接对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);
        }
    }
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值