PageHelper分页的一些问题

最近写项目的时候,突然发现自己的分页有点问题,现在项目中大部分分页都是使用PageHelper等一些插件来帮我们简化操作,很多人会用,但是没有仔细去思考过,之前我也是,所以遇到问题有点懵,下面分享一些自己遇到的问题,希望帮助大家

1.PageHelper分页原理

PageHelper的分页原理其实很简单,主要是利用PageHelper.startPage(pageNum, pageSize)这个语句,这句代码其实相当于在我们的SQL语句中拼接了limit 关键字,但是有一点要特别注意PageHelper.startPage()必须放在我们要执行的SQL前面,因为如果我们有多个查询语句的话,会抢占掉这个分页,所以最好将startPage()和你要分页的SQL放在一起,如例:

PageHelper.startPage(pageNum, pageSize);
List<Task> taskList = taskMapper.selectByExample(taskExampl

这个第一个需要重视的点

2.可能存在的问题

使用PageHelper进行分页,一般会出现两种问题,第一种是分页无效,这种就是因为有其他的SQL查询语句抢占了分页,这种我上面说过了,将分页语句和要查询的SQL语句放在一起就能解决,下面主要说第二种可能会出现的问题

在开发中,我们一般会将数据封装成我们定义过的pojo对象,直接返回给前端,但在实际开发中,我们一般只返回前端需要的数据,所以这时候,一般会定义一个vo的类,这个vo中有我们pojo类中的部分字段,还有一些我们自定义的、需要在页面渲染的数据,如下例子:

public class MediaTaskVO extends MonitorOneMachineMedia {

 /**
     * 审核人员id列表
     */
    private List<Long> reviewUserId;
}

public class MonitorOneMachineMedia implements Serializable {
    @ApiModelProperty(value="id主键id")
    private Long id;

    @ApiModelProperty(value="tenantId所属租户id")
    private Long tenantId;

    @ApiModelProperty(value="name名称/标题")
    private String name;

    @ApiModelProperty(value="type类型: 0-视频 1-图片")
    private Integer type;

    private static final long serialVersionUID = 1L;
}

这时候我们需要将分页的数据包装成MediaTaskVO返回给前端进行渲染

List<MediaTaskVO> mediaVOList = new ArrayList<>();
   mediaList.forEach(u -> {
   MediaTaskVO vo = new MediaTaskVO();
   BeanUtils.copyProperties(u, vo);

   List<MonitorOneMachineUserAudit> userAuditList = userAuditMapper.selectByExample(MonitorOneMachineUserAuditExample
          .newAndCreateCriteria()
          .andStatusEqualTo(UserAuditStatusEnums.RUNNING.code())
          .andMediaIdEqualTo(u.getId())
          .example());
   List<Long> userIdList =userAuditList.stream().map(MonitorOneMachineUserAudit::getUserId).collect(Collectors.toList());
   vo.setReviewUserId(userIdList);
   mediaVOList.add(vo);});
   PageInfo<MediaTaskVO> pageInfo = new PageInfo<>(mediaVOList);
   CommonPageResultDto commonPageResultDto = new CommonPageResultDto(pageInfo.getTotal(), (long) pageInfo.getPages(),pageInfo.getList());
   return new CommonResultDto(CommonResultEnum.SUCCESS, commonPageResultDto);

注意,这样写会有问题的,你会发现你的页数永远是1,切记PageInfo传的一定要是你分页查询出来的数据列表,不能是封装的VOlist,正确的写法如下

PageInfo<MonitorOneMachineMedia> pageInfo = new PageInfo<>(mediaList);if (CollectionUtils.isEmpty(pageInfo.getList())) {    return new CommonResultDto(CommonResultEnum.SUCCESS, new CommonPageResultDto(0L, 0L, null));}List<MediaTaskVO> mediaVOList = new ArrayList<>();mediaList.forEach(u -> {    MediaTaskVO vo = new MediaTaskVO();    BeanUtils.copyProperties(u, vo);List<MonitorOneMachineUserAudit> userAuditList = userAuditMapper.selectByExample(MonitorOneMachineUserAuditExample         .newAndCreateCriteria()                                                                                                          .andStatusEqualTo(UserAuditStatusEnums.RUNNING.code())         .andMediaIdEqualTo(u.getId())         .example() );    List<Long> userIdList = userAuditList.stream().map(MonitorOneMachineUserAudit::getUserId).collect(Collectors.toList());    vo.setReviewUserId(userIdList);    mediaVOList.add(vo);});CommonPageResultDto commonPageResultDto = new CommonPageResultDto(pageInfo.getTotal(), (long) pageInfo.getPages(), mediaVOList);return new CommonResultDto(CommonResultEnum.SUCCESS, commonPageResultDto);  

我的分享到此为止,希望能帮助到大家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值