譬如:下面这段代码本来想根据 userName 以及 userCompany 进行条件查询的,但是 startPage() 后面紧跟的不是 userMapper.getUserList(userName, userCompany),因此,分页“并不会生效”,或者说分页用错地方了,用在 userMapper.getById(id) 上了,自然看不到想要的效果。(可自行在控制台查看 sql 的执行效果)
// 设置分页查询条件
PageHelper.startPage(pageNum, pageSize);
// 根据id查询
int user = userMapper.getById(id);
// 根据 userName 和 userCompany 进行条件查询
List<User> userList = userMapper.getUserList(userName, userCompany);
// ...
return xxx;
这位小哥 跟我遇到的问题一样,但是我俩的解决思路不一样(而且我通过他的方法没成功欸 … )
"total": 10,
"list": [
{
"userId": "2510109292",
"userName": "何老师",
"userAge": 43
},
{
"userId": "25930291056",
"userName": "李老师",
"userAge": 37
}
],
"pageNum": 2,
"pageSize": 2,
"size": 2,
"startRow": 3,
"endRow": 4,
"pages": 5,
"prePage": 1,
"nextPage": 3,
"isFirstPage": false,
"isLastPage": false,
"hasPreviousPage": true,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [1,2,3,4,5],
"navigateFirstPage": 1,
"navigateLastPage": 5
这个可能有一定的使用场景:我遇到的情况是这样的:
// 设置分页查询条件
PageHelper.startPage(pageNum, pageSize);
// 根据 userName 和 userCompany 进行条件查询
List<User> userList = userMapper.getUserList(userName, userCompany);
// 但是我并不是要返回下面这样的:
//PageInfo pageInfo2 = new PageInfo<>(userList);
//return pageInfo2;
// 而是需要对 User 对象的某些属性重新进行赋值,并返回其进一步封装之后的对象,例如 UserDto(不是 User)
List<UserDto> userDtoList = new ArrayList<>();
foreach(User user : userList){
// 对user的属性重新赋值,并构造新的对象 UserDto
// ....
user.setXxx();
UserDto userDto = new UserDto(user);
userDtoList.add(userDto);
}
PageInfo<UserDto> pageInfo = new PageInfo<>(userDtoList);
return pageInfo;
// 这样得到的分页相关属性是不对的,我测试过。详情原因可以看看PageInfo的源码,我还没看...
简言之:
问题就在于我并没有把分页查询的结果(原有的 List)返回,而是返回了一个重新构造的 List
我的解决方法是:
虽然 pageInfo 的分页相关属性不正确,但是前面 List 对应的 pageInfo2 的分页相关属性是正确的,所以可以让最终返回的 pageInfo 的属性也重新进行赋值:
PageInfo<PatientDto> pageInfo = new PageInfo<>(userDtoList);
// 重新对 PageInfo 的分页属性进行赋值
pageInfo.setPageNum(pageInfo2.getPageNum());
pageInfo.setPageSize(pageInfo2.getPageSize());
pageInfo.setTotal(pageInfo2.getTotal());
pageInfo.setSize(pageInfo2.getSize());
pageInfo.setStartRow(pageInfo2.getStartRow());
pageInfo.setEndRow(pageInfo2.getEndRow());
pageInfo.setPages(pageInfo2.getPages());
pageInfo.setPrePage(pageInfo2.getPrePage());
pageInfo.setNextPage(pageInfo2.getNextPage());
pageInfo.setIsFirstPage(pageInfo2.isIsFirstPage());
pageInfo.setIsLastPage(pageInfo2.isIsLastPage());
pageInfo.setHasPreviousPage(pageInfo2.isHasPreviousPage());
pageInfo.setHasNextPage(pageInfo2.isHasNextPage());
pageInfo.setNavigatePages(pageInfo2.getNavigatePages());
pageInfo.setNavigatepageNums(pageInfo2.getNavigatepageNums());
pageInfo.setNavigateFirstPage(pageInfo2.getNavigateFirstPage());
pageInfo.setNavigateLastPage(pageInfo2.getNavigateLastPage());
顺便说一下,跟前端同学沟通过之后,发现他们在实现分页功能的时候,其实只用到了我返回的 pageNum、pageSize、total 这三个参数,其余参数他们是通过前端的分页插件/框架帮忙计算好了… 所以按理说,只需要重新对这三个参数进行重新赋值就好了。
但是由于网页端的分页效果大多如下图所示:
而移动端小程序或者APP通常不使用这种效果:使用上滑–上滑–上滑的样式,滑倒底部之后,自动切换下一页,直到最后一页。所以针对小程序端,他们还会用到 isLastPage(是否是最后一页)这个参数进行判断。为了保险起见,还是保证所有的分页参数都正确吧 !!!