SSM Mybatis在设置排序后PageHelper分页插件分页第5页开始失效的问题

  • 场景

    一个简单的页面查询(后台用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写排序都是没问题的,只是不要一起使用就可以。

 

  • 以下是参考博文
  • https://blog.csdn.net/cn_lyg/article/details/100560483

你可能感兴趣的:(Java,#,SQL)