当前使用版本(必填,否则不予处理)
3.5.3.1
该问题是如何引起的?(确定最新版也有问题再提!!!)
Oracle12数据库进行分页查询时,如果先进行了排序后再分页,分页的结果和预期不符,甚至导致每一页查到的数据都一样。
重现步骤(如果有就写完整)
在使用分页的语句的wrapper中添加wrapper.orderByAsc("xxx")排序后即可复现(用排序效果明显的字段能更好复现)。
报错信息
比如我有一张table表,字段有a,b,c,d,e,现在要根据a字段作为条件,并根据b字段排序后,对查询结果分页,mybatis-plus实际打印出来的sql为: SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( SELECT a,b,c,d,e FROM table WHERE (a = ?) ORDER BY b ASC ) TMP WHERE ROWNUM <=?) WHERE ROW_ID > ? 经反复测试,查询结果和预期不符,因为受到排序的影响,中间临时表的ROWNUM与最里面table的ROWNUM已经不一致了,分页时使用TMP的ROWNUM来判断就不合适了。
后来我参考了mi-010老师在CSDN上发布的博客:这篇博客,他的解决方法是重写OracleDialect,在TMP临时表外层再添加一层TMP2,让TMP的ROWNUM固定,和table保持一致(我是这样理解这篇博客的),经测试,有效。
但是添加一层嵌套必然会增加查询开销,故向团队提问能否解决该问题。
Comment From: AileYoung
是没看到还是我的提问有误?
Comment From: Bin1993
配置分页插件的时候,你指定一下方言,new PaginationInnerInterceptor(DbType.ORACLE_12C)