- 场景
一个简单的页面查询(后台用mvc+mybatis),page.html——>Controller——>Service(PageHelper ——>调用Dao查询)——>Dao(sql语句写在mybatis的DaoClassNameMapper.xml中)——>DataSourse。
- 问题发现及过程
1.业务说这个页面排序,所以我首先直接在mybatis的DaoClassNameMapping.xml中的查询加了一句:"order by 排序字段 desc",结果页面分页的功能在第二页开始就没效了。
2.我开始百度,信息梳理入下:
2.1.网上说排序的最好用PageHelper.orderBy("字段名 排序方式DESC|ASC");设置比较好。
2.2.而且是在调用Dao前设置进去,因为这样在mybatis查询的时候,会从Pagehelper中获取排序规则动态拼接到Mapping.xml中写的SQL中,如果自己在SQL写了排序,可能会导致PageHelper设置后动态拼接SQL出现两个"order by"失效;(我的显然不是这个问题,因为我没在PageHelper中设置排序)。
3.问题原因:
分页是依据起始点和偏移量的,页面每点击换页,就会重新设置起始点和偏移量来查询某一页的展示结果集,这要求排序字段唯一,我这次是按日期(某月yyyyMM)排序,因为众多数据的日期是非唯一的,所以换页之后的查询可能和换页前的查询顺序是一样的,就出问题了。
4.解决办法:
双字段排序,即二级排序。 比如"order by 非唯一字段 DESC"分页失效,那么就再设置一个唯一字段的二级排序。比如"order by 非唯一字段 DESC,唯一字段 DESC"。可解决排序后PageHelper失效的问题。
后话:
其实PageHelper设置排序和直接在SQL写排序都是没问题的,只是不要一起使用就可以。
- 以下是参考博文