SpringBoot+Mybatis+PageHelper分页(踩坑-total,pages总数有误)

一、如何集成插件java

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.2</version>
        </dependency>

二、application-dev.properties配置信息(pageHelper使用默认配置,不写也OK 的)mysql

###pagehelper###
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=pageNum=punt=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
pagehelper.row-bounds-with-count=false

三、看代码,这个代码是错误的,total,pages跟实际数据库数据不一致。pages=1,total=1,而且该值永远等于查询页的记录数, 即getTotal和getSize()效果相同. 读者若自行查看SQL日志, 可发现startPage()方法成功执行, 返回的List是符合查询条件的.啥缘由呢?git

网上有说1.2.0版本有问题,也有人说查出来的list,不能进行操做,不然会引发total根实际数据不一致的状况,以下我对查出来的list把领域E转成DTO了等等说法。github

 

public ResponseMessage<PagePing<DocTemplateDTO>> getDocTemplateList(DocTemplateDTO docTemplateDTO,Integer currentPage,Integer pageSize) {
		ResponseMessage<PagePing<DocTemplateDTO>> resp = new ResponseMessage<>();
		PagePing<DocTemplateDTO> p=new PagePing<>();
		try {
			PageHelper.startPage(currentPage,pageSize);
			DocTemplateE docTemplateE = this.docTemplateDomainFactory.convert(docTemplateDTO);
			List<DocTemplateE> list = docTemplateE.findList(docTemplateE);
			if (CollectionUtils.isNotEmpty(list)) {
                  PageInfo<DocTemplateDTO> pageInfo = new PageInfo<>(docTemplateConverter.dataToDTO(list));
                  // 转换成本身的分页信息
                  PageBean<DocTemplateDTO> pb=new PageBean<>();
                  pb.setCurrentPage(pageInfo .getPageNum());
                  pb.setPageSize(pageInfo .getPageSize());
                  pb.setPageCount(pageInfo .getPages());
                  pb.setTotalData(pageInfo .getTotal());
                  p.setDataList(pageInfo .getList());
                  p.setPage(pb);
				ResponseUtil.setResult(resp, p, ErrorCodeEnum.SUCCESS, true);
			} else {
				ResponseUtil.setResult(resp,null, ErrorCodeEnum.NORECORD,false);
			}
		} catch (Exception e) {
			logger.error("查询单证模板失败", e);
			ResponseUtil.setResult(resp,null, ErrorCodeEnum.ERROR,false);
		}
		return resp;
	}

四、解决方法,对好比上。在设置Page page = (Page) PageHelper.startPage(currentPage,pageSize); 获取page数据。由于PageInfo里面 的page信息,都是对于查询结果进行分页的。spring

public ResponseMessage<PagePing<DocTemplateDTO>> getDocTemplateList(DocTemplateDTO docTemplateDTO,Integer currentPage,Integer pageSize) {
		ResponseMessage<PagePing<DocTemplateDTO>> resp = new ResponseMessage<>();
		PagePing<DocTemplateDTO> p=new PagePing<>();
		try {
			Page page = (Page) PageHelper.startPage(currentPage,pageSize);
			DocTemplateE docTemplateE = this.docTemplateDomainFactory.convert(docTemplateDTO);
			List<DocTemplateE> list = docTemplateE.findList(docTemplateE);
			if (CollectionUtils.isNotEmpty(list)) {
                  PageInfo<DocTemplateDTO> pageInfo = new PageInfo<>(docTemplateConverter.dataToDTO(list));
                  // 转换成本身的分页信息
                  PageBean<DocTemplateDTO> pb=new PageBean<>();
                  pb.setCurrentPage(page.getPageNum());
                  pb.setPageSize(page.getPageSize());
                  pb.setPageCount(page.getPages());
                  pb.setTotalData(page.getTotal());
                  p.setDataList(pageInfo.getList());
                  p.setPage(pb);
				ResponseUtil.setResult(resp, p, ErrorCodeEnum.SUCCESS, true);
			} else {
				ResponseUtil.setResult(resp,null, ErrorCodeEnum.NORECORD,false);
			}
		} catch (Exception e) {
			logger.error("查询单证模板失败", e);
			ResponseUtil.setResult(resp,null, ErrorCodeEnum.ERROR,false);
		}
		return resp;
	}

 

如上。问题坑了2个多小时。记录一下,望广大友军勿采坑sql

相关文章
相关标签/搜索