当分页和数据权限一起使用时,会出现查不出数据的情况。
分页使用的是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,这样就导致查不出自己创建的时间靠后的数据。
数据权限对于后台系统很重要,建议尽快修复。