加了数据权限(@DataAuth)后会变成嵌套查询导致sql分页失效

Blade 未结 1 140
six_six_2005
six_six_2005 剑圣 2025-06-25 17:13

一、该问题的重现步骤是什么?

加数据权限前,执行的sql如下:


SELECT a.*, tbau.unit_name AS accounting_unit_name, bu.real_name AS area_manager_name
FROM t_tracking_report a
	LEFT JOIN t_base_accounting_unit tbau ON a.accounting_unit_id = tbau.id
	LEFT JOIN blade_user bu ON a.area_manager_id = bu.id
WHERE a.is_deleted = 0
	AND a.tenant_id = '999999'
ORDER BY a.update_time DESC, a.create_time DESC
LIMIT 10


加了数据权限@DataAuth注解后,执行的sql如下:

@DataAuth(type = DataScopeEnum.OWN_DEPT_CHILD)
SELECT *
FROM (
	SELECT a.*, tbau.unit_name AS accounting_unit_name, bu.real_name AS area_manager_name
	FROM t_tracking_report a
		LEFT JOIN t_base_accounting_unit tbau ON a.accounting_unit_id = tbau.id
		LEFT JOIN blade_user bu ON a.area_manager_id = bu.id
	WHERE a.is_deleted = 0
		AND a.tenant_id = '999999'
	ORDER BY a.update_time DESC, a.create_time DESC
) scope
WHERE scope.create_dept IN (1907273787702034434)
LIMIT 10



二、你期待的结果是什么?实际看到的又是什么?

期待:加上数据权限后可以正常分页查询

实际:加了数据权限后会变成嵌套查询使内部查询的sql分页失效,导致全表查询。数据量大了查询会超时,导致页面永远加载不出来数据。


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

Bladex4.2.0

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

1条回答
  • 2025-06-25 23:36

    有多个join的情况不适合用数据权限的功能,因为数据权限的插件底层不知道你的具体sql是什么,只能在最外层加条件。

    这种情况建议你直接把条件写到你的sql里么进行权限处理。


    数据权限主要适用单表查询,查询返回后通过wrapper类进行包装从缓存获取其他字段映射的场景

    0 讨论(0)
代码语言
提交回复