分页+数据权限bug

建议 4 1582
zklt
zklt VIP3 2021-10-25
当分页和数据权限一起使用时,会出现查不出数据的情况。 分页使用的是mybatis-plus的插件PaginationInnerInterceptor,先执行的是PaginationInnerInterceptor中的beforeQuery方法,然后再执行自定义数据权限DataFilterInterceptor中的intercept,这样就会导致,数据过滤语句加在分页之后。 img[//cdn.renren.io/c3b92202110251206358454.png] 具体表现为,功能示例,新闻模块,用A创建1条数据,用B创建12条数据,因为是按时间排序,A的数据时间最早,排在最后。登录A账号,发现没有数据,列表下方显示共1条。查看后台发现,查询条数使用的sql是 SELECT COUNT(*) FROM tb_news WHERE 1 = 1 AND (creator=1426107718444933122) ;查询出1条。 查分页使用的sql是 SELECT * FROM (SELECT TMP.*, ROWNUM ROW_ID FROM (SELECT * FROM tb_news WHERE 1 = 1 ORDER BY create_date DESC) TMP WHERE ROWNUM <= 10) WHERE ROW_ID > 0 AND (creator=1426107718444933122) ;查询出0条。 是因为,creator条件,不应该放在最外层,应该放在里面。 如果放在外面,是先查出日期靠前的10条,再查creator,这样就导致查不出自己创建的时间靠后的数据。 数据权限对于后台系统很重要,建议尽快修复。
回帖
  • 修改一下mybatis-plus的配置文件,把@Order()顺序修改一下试试 像MySQL就不会出现这个问题
    0
  • zklt
    zklt VIP3 (楼主)
    2021-10-25
    @Mark mysql确实没这个问题,但是Oracle有,我用的是Oracle 11g。修改配置文件的顺序也不行。希望能尽快修复一下。
    0
  • zklt
    zklt VIP3 (楼主)
    2021-10-25
    @Mark 问题不是mybatis-plus,是数据过滤类DataFilterInterceptor里面的getSelect方法 img[//cdn.renren.io/831f9202110251605266653.png] 这是Oracle数据库 img[//cdn.renren.io/e9098202110251605433728.png] 这是MySQL数据库 如图,plainSelect.getWhere(); 这个方法有问题,MySQL用的是limit,Oracle用的是row_id。所以在找where条件加数据过滤条件时,就加在了后面。
    0
  • @zklt 已修复,把mybatis-plus升级到3.4.3就可以了,更新一下代码
    0
本帖已结贴