在最近写代码时遇到的一个问题:通过 PageInfo 进行分页后返回的总条数total一直不正确。
问题代码如下:
public Result selectUser(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> list = userMapper.getAll();
if (list != null && list.size() != 0) {
//省略对list的逻辑处理
}
PageInfo pageInfo = new PageInfo(list);
return Result.of(pageInfo);
}
在通过断点调试后发现问题就出在对list进行逻辑处理的地方。逻辑处理之后我从 PageInfo 中取出的total就不对了。
查阅资料发现在调用PageHelper之后有几点注意事项:
- 当我们调用pagehelper.startPage()方法后下一条语句必须是你要调用的查询语句;
- 我们的PageInfo传入的结果集,必须是我们调用查询语句返回的结果集;
显然我们出现这个错误的原因就是违背了第二条原则,我们对结果集list进行了逻辑处理,导致 PageInfo 封装的list不再是我们调用查询语句返回的结果集了。
只要我们严格遵守以上两条注意事项就一定不会出问题的。
那么有的人就会问“可是我的代码一定要进行逻辑处理之后才能调用 PageInfo 怎么办”。
没关系,有一种很简单的解决方法,代码如下:
public Result selectUser(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> list = userMapper.getAll();
PageInfo pageInfo = new PageInfo(list);
List<User> resList = new ArrayList<>(list);
if (resList!= null && resList.size() != 0) {
//省略对resList的逻辑处理
}
//重新设置list
pageInfo.setList(resList);
return Result.of(pageInfo);
}
也就是另外通过一个list进行额外的逻辑处理,处理完之后调用pageInfo.setList()方法重新设置经过处理的list,这样就可以保证PageInfo封装的list是我们查询语句得到的结果集,最终返回的list也是我们所需要的list。