很久之前出的一个问题了-使用pagehelper分页已经开启分页了,但是没有生效,一直没总结,直到今天看到一个wechat作者总结的一篇文章-在一定场景下回导致OOM,那么就来总结一下。
下方为Error Code:
/** @author sunshaocong */
@RestController
@RequestMapping("/test")
public class TestController {
private final GpsService gpsService;
private final UserService userService;
public TestController(GpsService gpsService, UserService userService) {
this.gpsService = gpsService;
this.userService = userService;
}
@GetMapping("/page")
public ResponseEntity<?> pageGps() {
PageHelper.startPage(1, 10);
userService.lambdaQuery().eq(User::getId, "5f09beaa2bbde45f19a0546b");
List<Gps> gpsList = gpsService.getList(new QueryWrapper<>());
PageInfo<Gps> gpsPages = new PageInfo<>(gpsList);
return CommonResponse.success(gpsPages);
}
}
正常逻辑来说,看到了开启分页并且设置页码为1页大小为10,那么在最终的gpsPages应该是返回一页,十条数据,但事实并非如此,实际的执行效果如下:
{
"code": 200,
"message": "ok",
"data": {
"total": 4743,
"list": [
{
"id": "5f09beaa2bbde45f19a0546b",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "1:0:0",
"percentOver85OfHRMaxDuration": "1:0:0",
"percentBetween75And85OfHRMaxDuration": "1:0:0",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a0546b",
"percentOver92OfHRMaxDuration": "1:0:0",
"totalDuration": "1:0:0",
"distanceBetween20And25": 1.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "胡嘉祺",
"playerNameEn": "Hu Jiaqi"
},
{
"id": "5f09beaa2bbde45f19a05473",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "0:0:2",
"percentOver85OfHRMaxDuration": "0:0:2",
"percentBetween75And85OfHRMaxDuration": "0:0:2",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a05473",
"percentOver92OfHRMaxDuration": "0:0:2",
"totalDuration": "0:0:2",
"distanceBetween20And25": 1.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 11.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "孙胥卿",
"playerNameEn": "Sun Yuqing"
},
{
"id": "5f09beaa2bbde45f19a054cf",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "0:0:2",
"percentOver85OfHRMaxDuration": "0:0:2",
"percentBetween75And85OfHRMaxDuration": "0:0:2",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a054cf",
"percentOver92OfHRMaxDuration": "0:0:2",
"totalDuration": "0:0:2",
"distanceBetween20And25": 1.0,
"profileMaxHR": 11,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "马昆越",
"playerNameEn": "Ma Kunyue"
},
{
"id": "5f09beaa2bbde45f19a054d4",
"date": "2020-12-01",
"percentBetween85And92OfHRMaxDuration": "12:00:00",
"percentOver85OfHRMaxDuration": "12:00:00",
"percentBetween75And85OfHRMaxDuration": "12:00:00",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a054d4",
"percentOver92OfHRMaxDuration": "12:00:00",
"totalDuration": "12:00:00",
"distanceBetween20And25": 11.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-01",
"playerName": "王刚",
"playerNameEn": "Wang Gang"
},
{
"id": "5f09beaa2bbde45f19a054d8",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "0:0:6",
"percentOver85OfHRMaxDuration": "0:0:6",
"percentBetween75And85OfHRMaxDuration": "0:0:6",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a054d8",
"percentOver92OfHRMaxDuration": "0:0:6",
"totalDuration": "0:0:6",
"distanceBetween20And25": 1.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "李磊",
"playerNameEn": "Li Lei"
},
{
"id": "5f09beaa2bbde45f19a054d9",
"date": "2020-12-01",
"percentBetween85And92OfHRMaxDuration": "Yu",
"percentOver85OfHRMaxDuration": "Yyyuubbnn",
"percentBetween75And85OfHRMaxDuration": "Yuy",
"accelAndDecelPerMin": 22.0,
"totalDistance": 12.0,
"distanceOver25": 22.0,
"playerId": "5f09beaa2bbde45f19a054d9",
"percentOver92OfHRMaxDuration": "Yu",
"totalDuration": "Yu",
"distanceBetween20And25": 22.0,
"profileMaxHR": 22222,
"accelerations": 11,
"sessionMaxHR": 222222222,
"decelerations": 22,
"meanHeartRate": 2222222222222.22,
"weekIndex": 49,
"sprintCountOver20": 11,
"sprintDistancePerMin": 11.0,
"sprintMetersOver20": 11.0,
"createdDate": "2020-12-04",
"playerName": "于洋",
"playerNameEn": "Yu Yang"
},
{
"id": "5f09beaa2bbde45f19a054ec",
"date": "2020-12-02",
"percentBetween85And92OfHRMaxDuration": "1:0:0",
"percentOver85OfHRMaxDuration": "1:0:0",
"percentBetween75And85OfHRMaxDuration": "1:0:0",
"accelAndDecelPerMin": 100.0,
"totalDistance": 100.0,
"distanceOver25": 100.0,
"playerId": "5f09beaa2bbde45f19a054ec",
"percentOver92OfHRMaxDuration": "1:0:0",
"totalDuration": "1:0:0",
"distanceBetween20And25": 100.0,
"profileMaxHR": 100,
"accelerations": 100,
"sessionMaxHR": 100,
"decelerations": 100,
"meanHeartRate": 100.0,
"weekIndex": 49,
"sprintCountOver20": 100,
"sprintDistancePerMin": 100.0,
"sprintMetersOver20": 100.0,
"createdDate": "2020-12-02",
"playerName": "雷腾龙",
"playerNameEn": "Lei Tenglong"
},
{
"id": "5f09bee42bbde45f19a05f3e",
"date": "2020-04-22",
"percentBetween85And92OfHRMaxDuration": "",
"percentOver85OfHRMaxDuration": "",
"percentBetween75And85OfHRMaxDuration": "",
"accelAndDecelPerMin": 0.05899,
"totalDistance": 5013.41748,
"distanceOver25": 0.0,
"playerId": "5f09beaa2bbde45f19a05482",
"percentOver92OfHRMaxDuration": "",
"totalDuration": "5:22:05",
"distanceBetween20And25": 0.56,
"profileMaxHR": 0,
"accelerations": 11,
"sessionMaxHR": 0,
"decelerations": 8,
"seasonId": "5f09beaf2bbde45f19a05805",
"weekIndex": 17,
"sprintCountOver20": 0,
"sprintDistancePerMin": 0.00174,
"sprintMetersOver20": 0.56,
"createdDate": "2020-04-22",
"playerName": "陈怀远",
"playerNameEn": "Chen Huaiyuan"
},
{
"id": "5f09bee42bbde45f19a05f3f",
"date": "2020-04-22",
"percentBetween85And92OfHRMaxDuration": "",
"percentOver85OfHRMaxDuration": "",
"percentBetween75And85OfHRMaxDuration": "",
"accelAndDecelPerMin": 0.04968,
"totalDistance": 4696.04004,
"distanceOver25": 0.0,
"playerId": "5f09beaa2bbde45f19a0547f",
"percentOver92OfHRMaxDuration": "",
"totalDuration": "5:22:05",
"distanceBetween20And25": 2.71,
"profileMaxHR": 0,
"accelerations": 11,
"sessionMaxHR": 0,
"decelerations": 5,
"seasonId": "5f09beaf2bbde45f19a05805",
"weekIndex": 17,
"sprintCountOver20": 0,
"sprintDistancePerMin": 0.00841,
"sprintMetersOver20": 2.71,
"createdDate": "2020-04-22",
"playerName": "和玺",
"playerNameEn": "He Xi"
},
{
"id": "5f09bee42bbde45f19a05f40",
"date": "2020-04-22",
"percentBetween85And92OfHRMaxDuration": "",
"percentOver85OfHRMaxDuration": "",
"percentBetween75And85OfHRMaxDuration": "",
"accelAndDecelPerMin": 0.03838,
"totalDistance": 4701.95801,
"distanceOver25": 0.0,
"playerId": "5f09beaa2bbde45f19a05485",
"percentOver92OfHRMaxDuration": "",
"totalDuration": "6:04:47",
"distanceBetween20And25": 9.32,
"profileMaxHR": 0,
"accelerations": 10,
"sessionMaxHR": 0,
"decelerations": 4,
"seasonId": "5f09beaf2bbde45f19a05805",
"weekIndex": 17,
"sprintCountOver20": 1,
"sprintDistancePerMin": 0.02555,
"sprintMetersOver20": 9.32,
"createdDate": "2020-04-22",
"playerName": "和晓强",
"playerNameEn": "He Xiaoqiang"
},
....
],
"pageNum": 1,
"pageSize": 10,
"size": 10,
"startRow": 1,
"endRow": 10,
"pages": 475,
"prePage": 0,
"nextPage": 2,
"isFirstPage": true,
"isLastPage": false,
"hasPreviousPage": false,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [
1,
2,
3,
4,
5,
6,
7,
8
],
"navigateFirstPage": 1,
"navigateLastPage": 8
}
}
哈哈哈,数据量太大,页面先撑不住了,直接OOM了。所以证实那位wechat作者的文章,真的会OOM。
既然出现了问题,就需要知道为什么会出现这样的问题,以及这样的问题应该如何解决。
Point 1:-Why
在 PageHelper 使用文档(https://pagehelper.github.io/faq/)中第一句就阐述了:
只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页。请注意关键词紧跟
。为什么要紧跟呢?因为 PageHelper 的分页原理使用了 ThreadLocal,他的分页参数和线程是绑定在一起的,当我们执行PageHelper.startPage()
语句时,他会将分页参数绑定到ThreadLocal
中:
/**
* 开始分页
*
* @param pageNum 页码
* @param pageSize 每页显示数量
* @param count 是否进行count查询
* @param reasonable 分页合理化,null时用默认配置
* @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置
*/
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page<E>(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
//当已经执行过orderBy的时候
Page<E> oldPage = getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
setLocalPage(page);
return page;
}
//--------------------------------------------------
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
protected static boolean DEFAULT_COUNT = true;
/**
* 设置 Page 参数
*
* @param page
*/
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
//--------------------------------------------------
// 查询语句结束之后执行
@Override
public void afterAll() {
//这个方法即使不分页也会被执行,所以要判断 null
AbstractHelperDialect delegate = autoDialect.getDelegate();
if (delegate != null) {
delegate.afterAll();
autoDialect.clearDelegate();
}
clearPage(); // 注意这个方法,是个重点
}
//--------------------------------------------------
/**
* 移除本地变量
*/
public static void clearPage() {
LOCAL_PAGE.remove(); // 分页被移除,也就是之后的查询操作便使用不了本地变量
}
Point 2:-Deal it
治标不治本:移动PageHelper.startPage() 方法位置,让真正的查询语句紧挨着它。这种方案不治本的原因在于,如果又有小伙伴不知道这个坑,有可能又会踩。
治标治本:使用 Function Lamdba 表达式。
Method 1
@GetMapping("/page")
public ResponseEntity<?> pageGps() {
userService.lambdaQuery().eq(User::getId, "5f09beaa2bbde45f19a0546b").one();
PageHelper.startPage(1, 10);
List<Gps> gpsList = gpsService.getList(new QueryWrapper<>());
PageInfo<Gps> gpsPages = new PageInfo<>(gpsList);
return CommonResponse.success(gpsPages);
}
Method 2
@Builder
public class PageHelperTool<P, R> {
private final Function<P, PageInfo<R>> pageFunction;
public PageInfo<R> getPageInfo(P request) {
PageHelper.startPage(((QueryDTO)request).getPageNumber(),((QueryDTO)request).getPageSize());
return pageFunction.apply(request);
}
}
/**
* @author sunshaocong
*/
@Data
public class QueryDTO {
private Integer pageNumber;
private Integer pageSize;
private QueryWrapper<Gps> query;
}
public PageInfo getList(QueryDTO queryDTO) {
PageHelper.startPage(queryDTO.getPageNumber(), queryDTO.getPageSize());
List<Gps> gpsList = gpsMapper.selectList(queryDTO.getQuery());
return new PageInfo<>(gpsList);
}
@GetMapping("/page")
public ResponseEntity<?> pageGps(QueryDTO queryDTO) {
PageHelperTool<QueryDTO, Gps> pageHelperTool =
PageHelperTool.<QueryDTO, Gps>builder().pageFunction(gpsService::getList).build();
userService.lambdaQuery().eq(User::getId, "5f09beaa2bbde45f19a0546b").one();
queryDTO.setQuery(new QueryWrapper<>());
PageInfo<Gps> gpsPages = pageHelperTool.getPageInfo(queryDTO);
return CommonResponse.success(gpsPages);
}
注意,上边的QueryDTO实体可以进行复用,里边设置多个属性即可。
Result:
{
"code": 200,
"message": "ok",
"data": {
"total": 4743,
"list": [
{
"id": "5f09beaa2bbde45f19a0546b",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "1:0:0",
"percentOver85OfHRMaxDuration": "1:0:0",
"percentBetween75And85OfHRMaxDuration": "1:0:0",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a0546b",
"percentOver92OfHRMaxDuration": "1:0:0",
"totalDuration": "1:0:0",
"distanceBetween20And25": 1.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "胡嘉祺",
"playerNameEn": "Hu Jiaqi"
},
{
"id": "5f09beaa2bbde45f19a05473",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "0:0:2",
"percentOver85OfHRMaxDuration": "0:0:2",
"percentBetween75And85OfHRMaxDuration": "0:0:2",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a05473",
"percentOver92OfHRMaxDuration": "0:0:2",
"totalDuration": "0:0:2",
"distanceBetween20And25": 1.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 11.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "孙胥卿",
"playerNameEn": "Sun Yuqing"
},
{
"id": "5f09beaa2bbde45f19a054cf",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "0:0:2",
"percentOver85OfHRMaxDuration": "0:0:2",
"percentBetween75And85OfHRMaxDuration": "0:0:2",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a054cf",
"percentOver92OfHRMaxDuration": "0:0:2",
"totalDuration": "0:0:2",
"distanceBetween20And25": 1.0,
"profileMaxHR": 11,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "马昆越",
"playerNameEn": "Ma Kunyue"
},
{
"id": "5f09beaa2bbde45f19a054d4",
"date": "2020-12-01",
"percentBetween85And92OfHRMaxDuration": "12:00:00",
"percentOver85OfHRMaxDuration": "12:00:00",
"percentBetween75And85OfHRMaxDuration": "12:00:00",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a054d4",
"percentOver92OfHRMaxDuration": "12:00:00",
"totalDuration": "12:00:00",
"distanceBetween20And25": 11.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-01",
"playerName": "王刚",
"playerNameEn": "Wang Gang"
},
{
"id": "5f09beaa2bbde45f19a054d8",
"date": "2020-12-05",
"percentBetween85And92OfHRMaxDuration": "0:0:6",
"percentOver85OfHRMaxDuration": "0:0:6",
"percentBetween75And85OfHRMaxDuration": "0:0:6",
"accelAndDecelPerMin": 1.0,
"totalDistance": 1.0,
"distanceOver25": 1.0,
"playerId": "5f09beaa2bbde45f19a054d8",
"percentOver92OfHRMaxDuration": "0:0:6",
"totalDuration": "0:0:6",
"distanceBetween20And25": 1.0,
"profileMaxHR": 1,
"accelerations": 1,
"sessionMaxHR": 1,
"decelerations": 1,
"meanHeartRate": 1.0,
"weekIndex": 49,
"sprintCountOver20": 1,
"sprintDistancePerMin": 1.0,
"sprintMetersOver20": 1.0,
"createdDate": "2020-12-05",
"playerName": "李磊",
"playerNameEn": "Li Lei"
},
{
"id": "5f09beaa2bbde45f19a054d9",
"date": "2020-12-01",
"percentBetween85And92OfHRMaxDuration": "Yu",
"percentOver85OfHRMaxDuration": "Yyyuubbnn",
"percentBetween75And85OfHRMaxDuration": "Yuy",
"accelAndDecelPerMin": 22.0,
"totalDistance": 12.0,
"distanceOver25": 22.0,
"playerId": "5f09beaa2bbde45f19a054d9",
"percentOver92OfHRMaxDuration": "Yu",
"totalDuration": "Yu",
"distanceBetween20And25": 22.0,
"profileMaxHR": 22222,
"accelerations": 11,
"sessionMaxHR": 222222222,
"decelerations": 22,
"meanHeartRate": 2222222222222.22,
"weekIndex": 49,
"sprintCountOver20": 11,
"sprintDistancePerMin": 11.0,
"sprintMetersOver20": 11.0,
"createdDate": "2020-12-04",
"playerName": "于洋",
"playerNameEn": "Yu Yang"
},
{
"id": "5f09beaa2bbde45f19a054ec",
"date": "2020-12-02",
"percentBetween85And92OfHRMaxDuration": "1:0:0",
"percentOver85OfHRMaxDuration": "1:0:0",
"percentBetween75And85OfHRMaxDuration": "1:0:0",
"accelAndDecelPerMin": 100.0,
"totalDistance": 100.0,
"distanceOver25": 100.0,
"playerId": "5f09beaa2bbde45f19a054ec",
"percentOver92OfHRMaxDuration": "1:0:0",
"totalDuration": "1:0:0",
"distanceBetween20And25": 100.0,
"profileMaxHR": 100,
"accelerations": 100,
"sessionMaxHR": 100,
"decelerations": 100,
"meanHeartRate": 100.0,
"weekIndex": 49,
"sprintCountOver20": 100,
"sprintDistancePerMin": 100.0,
"sprintMetersOver20": 100.0,
"createdDate": "2020-12-02",
"playerName": "雷腾龙",
"playerNameEn": "Lei Tenglong"
},
{
"id": "5f09bee42bbde45f19a05f3e",
"date": "2020-04-22",
"percentBetween85And92OfHRMaxDuration": "",
"percentOver85OfHRMaxDuration": "",
"percentBetween75And85OfHRMaxDuration": "",
"accelAndDecelPerMin": 0.05899,
"totalDistance": 5013.41748,
"distanceOver25": 0.0,
"playerId": "5f09beaa2bbde45f19a05482",
"percentOver92OfHRMaxDuration": "",
"totalDuration": "5:22:05",
"distanceBetween20And25": 0.56,
"profileMaxHR": 0,
"accelerations": 11,
"sessionMaxHR": 0,
"decelerations": 8,
"seasonId": "5f09beaf2bbde45f19a05805",
"weekIndex": 17,
"sprintCountOver20": 0,
"sprintDistancePerMin": 0.00174,
"sprintMetersOver20": 0.56,
"createdDate": "2020-04-22",
"playerName": "陈怀远",
"playerNameEn": "Chen Huaiyuan"
},
{
"id": "5f09bee42bbde45f19a05f3f",
"date": "2020-04-22",
"percentBetween85And92OfHRMaxDuration": "",
"percentOver85OfHRMaxDuration": "",
"percentBetween75And85OfHRMaxDuration": "",
"accelAndDecelPerMin": 0.04968,
"totalDistance": 4696.04004,
"distanceOver25": 0.0,
"playerId": "5f09beaa2bbde45f19a0547f",
"percentOver92OfHRMaxDuration": "",
"totalDuration": "5:22:05",
"distanceBetween20And25": 2.71,
"profileMaxHR": 0,
"accelerations": 11,
"sessionMaxHR": 0,
"decelerations": 5,
"seasonId": "5f09beaf2bbde45f19a05805",
"weekIndex": 17,
"sprintCountOver20": 0,
"sprintDistancePerMin": 0.00841,
"sprintMetersOver20": 2.71,
"createdDate": "2020-04-22",
"playerName": "和玺",
"playerNameEn": "He Xi"
},
{
"id": "5f09bee42bbde45f19a05f40",
"date": "2020-04-22",
"percentBetween85And92OfHRMaxDuration": "",
"percentOver85OfHRMaxDuration": "",
"percentBetween75And85OfHRMaxDuration": "",
"accelAndDecelPerMin": 0.03838,
"totalDistance": 4701.95801,
"distanceOver25": 0.0,
"playerId": "5f09beaa2bbde45f19a05485",
"percentOver92OfHRMaxDuration": "",
"totalDuration": "6:04:47",
"distanceBetween20And25": 9.32,
"profileMaxHR": 0,
"accelerations": 10,
"sessionMaxHR": 0,
"decelerations": 4,
"seasonId": "5f09beaf2bbde45f19a05805",
"weekIndex": 17,
"sprintCountOver20": 1,
"sprintDistancePerMin": 0.02555,
"sprintMetersOver20": 9.32,
"createdDate": "2020-04-22",
"playerName": "和晓强",
"playerNameEn": "He Xiaoqiang"
}
],
"pageNum": 1,
"pageSize": 10,
"size": 10,
"startRow": 1,
"endRow": 10,
"pages": 475,
"prePage": 0,
"nextPage": 2,
"isFirstPage": true,
"isLastPage": false,
"hasPreviousPage": false,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [
1,
2,
3,
4,
5,
6,
7,
8
],
"navigateFirstPage": 1,
"navigateLastPage": 8
}
}
不多不少,刚刚好10条。
这样就可以彻底解决因误用 PageHelper 导致分页失效的问题了。在使用别人封装好的框架时注意认真看文档!!!