PageHelper 插件踩过的坑
-
PageHelper.startPage(pageNum, pageSize);要紧跟 select
-
在将集合数据传入pageInfo的时候, 要用有参数的的构造, 不能使用set
PageInfo pageInfo = new PageInfo<>(pictureInfos); -
尽量不要用pageHelper 中的排序, 排序的时候, 尽量用example 中的排序, 因为 先筛选后排序, 再分页查询, 更符合逻辑
-
在一个页面中, 两个分页的地方, 不要调用同一个分页service方法, 因为, pageHelper, 会有total 的坑, 不知道的, 可以搜索 pageHelper total 的问题, 解决办法就是, 再重新写一个分页的service
-
sql 中不要用重复的字段,有重复的就取别名。Mysql报错Duplicate column name xxx
一: 下面是正确的代码, 注意顺序, 和PageInfo 的有参数构造, 尽量这样写
PageHelper.startPage(pageNum, pageSize);
List<PictureInfo> pictureInfos = pictureInfoMapper.selectByExample(example);
PageInfo<PictureInfo> pageInfo = new PageInfo<>(pictureInfos);
二: 当PageHelper和foreach循环时候, 遇到个小坑, 自己在返回的集合中, 自己想对每个VideoInfo的VideoUrl,做一下处理.下面是正确的做法
PageHelper.startPage(pageNum, pageSize);
List<VideoInfo> videoInfos = videoInfoMapper.selectByExample(example);
for (VideoInfo video : videoInfos){
if (!video.getVideoUrl().startsWith("http")){
video.setVideoUrl(videoPlayPrefix+video.getVideoUrl());
}
}
PageInfo<VideoInfo> pageInfo = new PageInfo<>(videoInfos);
自己原先的做法是,下面的
PageHelper.startPage(pageNum, pageSize);
List<VideoInfo> videoInfos = videoInfoMapper.selectByExample(example);
List<VideoInfo> list = new ArrayList<>();
for (VideoInfo video : videoInfos){
if (!video.getVideoUrl().startsWith("http")){
video.setVideoUrl(videoPlayPrefix+video.getVideoUrl());
}
list.add(video);
}
PageInfo<VideoInfo> pageInfo = new PageInfo<>(list);
结果是错的, 返回的总记录条数, 总是只返回页大小个数.
总结:
foreach 循环, 产生的是对象的引用, 是对原先的地址的引用, 是指针!
三: PageHelper.startPage(pageNum, pageSize); 这个放的位置决定了开始使用分页的位置, 尤其是有两个查询时, 要看清startPage放的位置
四:[转载]Duplicate column name 'xxx’错误
使用Paginator插件进行分页时,如果查询的字段中有重复,就会报错 Duplicate column name xxx。
如果单独执行查询语句,mysql是支持重复字段查询的,但是使用了Paginator插件后,会在查询SQL外面包一层进行统计,就变成了
select count(1) from (select fid,id,fid from user_info) post;