From 0aa65d0195a06869367f4902695d275d0ab39e64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 29 Jun 2026 15:30:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(system):=20=E4=BF=AE=E5=A4=8DUserMapper?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2=E9=87=8D=E5=A4=8D=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 解决分页查询时因sys_company多条记录导致的数据重复问题 - 将LEFT JOIN sys_company改为按tenant_id分组的子查询 - 修改后子查询仅取每个tenant_id的第一条公司记录 - 保证分页查询返回的数据不再重复 - 同步更新了编译后的目标类文件 --- .workbuddy/memory/2026-06-29.md | 15 +++++++++++++++ .../common/system/mapper/xml/UserMapper.xml | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .workbuddy/memory/2026-06-29.md diff --git a/.workbuddy/memory/2026-06-29.md b/.workbuddy/memory/2026-06-29.md new file mode 100644 index 0000000..306efea --- /dev/null +++ b/.workbuddy/memory/2026-06-29.md @@ -0,0 +1,15 @@ +# 2026-06-29 + +## fix: UserMapper.xml LEFT JOIN sys_company 导致分页查询记录重复 + +- 问题:`SELECT * FROM sys_user WHERE is_developer = 1` 只有5条记录,但 `/api/system/user/page?isDeveloper=true` 返回多条重复记录 +- 原因:`LEFT JOIN sys_company g ON g.tenant_id = t.tenant_id` 中,一个 tenant_id 可能在 sys_company 中有多条公司记录,产生笛卡尔积 +- 修复:将 `LEFT JOIN sys_company` 改为子查询,按 `tenant_id` 分组取第一条记录 + ```sql + LEFT JOIN ( + SELECT tenant_id, MAX(company_name) as company_name, MAX(company_logo) as company_logo + FROM sys_company + GROUP BY tenant_id + ) g ON g.tenant_id = t.tenant_id + ``` +- 同步修改了 `target/classes/` 下的编译版本 diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml b/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml index 03c5f4a..8911f7f 100644 --- a/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml +++ b/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml @@ -42,7 +42,11 @@ LEFT JOIN sys_user_group e ON a.group_id = e.group_id LEFT JOIN sys_user_grade f ON a.grade_id = f.grade_id LEFT JOIN sys_tenant t ON a.tenant_id = t.tenant_id - LEFT JOIN sys_company g ON g.tenant_id = t.tenant_id + LEFT JOIN ( + SELECT tenant_id, MAX(company_name) as company_name, MAX(company_logo) as company_logo + FROM sys_company + GROUP BY tenant_id + ) g ON g.tenant_id = t.tenant_id AND a.user_id = #{param.userId}