PageHelper 分页后再排序问题

2021-06-27 22:03:51 +08:00
 daimubai

大家好,我目前遇到的问题是 PageHelper 分页后再排序会出现顺序错乱的问题:

PageHelper 也可以实现排序,不过它只能对表中的数据直接排序,我现在的需求是对非表中的数据进行排序,需要先分页后,然后对 list 进行 sort,但是这样的问题是:比如分页后对 price 排序,会存在第二页数据的 price 比第一页数据的 price 小的情况。

我想到的解决办法是全查出来,然后逻辑分页。。。不过数据量大肯定不行了,不知道有没有大佬遇到过这种问题,有的话帮忙解答一下,请喝奶茶!

2272 次点击
所在节点    Java
17 条回复
Cbdy
2021-06-27 22:19:32 +08:00
写个 SQL 不好吗?

SELECT *
FROM price_table
ORDER BY price ASC
LIMIT 20 OFFSET 10;
daimubai
2021-06-27 22:22:02 +08:00
@Cbdy 可能我没有表述清楚,这个 price 不是表中的数据,假设是一个需要通过查出来的数据计算出来的值,所以无法在 sql 中排序
daimubai
2021-06-27 22:24:09 +08:00
@Cbdy 比如 表中有 a b c 三个字段,我的需求是根据 c 通过公式得出来的 d 排序,因此无法使用 sql 排序,因为 d 不在表中,而且我需要先查出来数据才能知道 d,但是这样就是会有第二页的 d 比第一页的 d 小的情况
fengpan567
2021-06-27 22:24:18 +08:00
手写 sql,连表查询。pagehelper 也支持手写的 sql 分页。
daimubai
2021-06-27 22:25:23 +08:00
@fengpan567 大佬,您看下, 比如 表中有 a b c 三个字段,我的需求是根据 c 通过公式得出来的 d 排序,因此无法使用 sql 排序,因为 d 不在表中,而且我需要先查出来数据才能知道 d,但是这样就是会有第二页的 d 比第一页的 d 小的情况
fengpan567
2021-06-27 22:26:33 +08:00
@daimubai 建议你搞个字段把价格存起来,或者 sql 里把价格公式带进去。
daimubai
2021-06-27 22:27:38 +08:00
@fengpan567 存起来这个我考虑下,因为我需要排序的字段很多,都需要公式,而且公式用到了工具类,挺复杂
daimubai
2021-06-27 22:28:18 +08:00
@daimubai 所以我想的是查出来然后通过 list 的 sort 排序能不能实现,也更灵活一点
daimubai
2021-06-27 22:30:05 +08:00
@fengpan567 好像存起来也不行,因为不同用户计算的结果也不一样,,,
fengpan567
2021-06-27 22:31:03 +08:00
@daimubai 不能这么搞,数据量大服务会崩掉
xuanbg
2021-06-27 23:29:31 +08:00
@daimubai 数据不大的话,也可以直接用计算结果排序。数据大的话,还是加一计算结果字段,专门用来排序好了。
cslive
2021-06-28 09:27:02 +08:00
SELECT RANK() over (order by (a+b) desc ) as rank from price_table
</br>
直接排序完完事
qwerthhusn
2021-06-28 09:57:06 +08:00
PageHelper 分页做的很暴力,查询 Count 的时候就是把你 SQL 外面套一层 select count(*) from (你的 SQL)
YzSama
2021-06-28 10:08:20 +08:00
楼上基本答案都告诉你了,

要快加个字段。
否则,先计算再分页。 分页在计算肯定不行的咯。
yazinnnn
2021-06-28 10:21:14 +08:00
你有没有考虑过是你的需求有问题呢
cobainlu
2021-06-29 13:05:16 +08:00
PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
return PageUtil.getPageVO(sysLogMapper.selectAll(vo));
cobainlu
2021-06-29 13:07:05 +08:00
PageHelper.startPage(pagenum,pageSize);
//进行排序
List=dao.select();
return PageUtil.getPageVO(list);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/786110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX