今天用CollectionUtils判斷集合是否為空時發現個奇怪的查詢數據:集合size=1,展開后提示“all elements are null”,SQL單獨查詢是空的。
就很奇怪,為什么SQL查出來一條都沒有但代碼里size=1還all elements are null。
Google了一下,都是說映射字段名稱的問題,都試過也不對。
我這里的數據庫是MySQL8,中間件是MyBatisPlus3.4.2,查詢SQL為:
select
r.tb_id,
r.role_code,
r.role_name,
r.role_desc
from t_sys_user u
left join t_sys_bind_user_role ur on ur.user_tb_id = u.tb_id
left join t_sys_role r on r.tb_id = ur.role_tb_id
where u.tb_id = #{sysUserTbId}
用戶、角色和中間表分別為:
用戶
tb_id | username | password | nickname | enabled | create_time | update_time | |
---|---|---|---|---|---|---|---|
1 | admin | 21232f297a57a5a743894a0e4a801fc3 | 張三 | admin@qq.com | 1 | 2020-12-13 00:09:54 | 2021-04-24 13:49:04 |
2 | jack | 4ff9fc6e4e5d5f590c4f2134a8cc96d1 | 李四 | jack@qq.com | 1 | 2020-12-13 00:11:39 | 2021-04-24 14:02:25 |
14 | rose | fcdc7b4207660a1372d0cd5491ad856e | rose | rose@qq.com | 1 | 2021-04-25 17:33:04 | 2021-04-25 18:32:48 |
角色
tb_id | role_code | role_name | role_desc |
---|---|---|---|
1 | ADMIN | 管理員 | |
2 | MEMBER_REGISTERED | 注冊會員 |
用戶角色中間表
user_tb_id | role_tb_id |
---|---|
1 | 1 |
2 | 1 |
目的是通過用戶ID查找對應的角色信息,但問題就出在這里:此時的中間表里沒有ROSE的角色信息,那么改一改SQL:
select
u.username, -- 新增查詢用戶名
r.tb_id,
r.role_code,
r.role_name,
r.role_desc
from t_sys_user u
left join t_sys_bind_user_role ur on ur.user_tb_id = u.tb_id
left join t_sys_role r on r.tb_id = ur.role_tb_id
-- 去掉ID篩選
結果:
username | tb_id | role_code | role_name | role_desc |
---|---|---|---|---|
admin | 1 | ADMIN | 管理員 | |
jack | 2 | MEMBER_REGISTERED | 注冊會員 | |
rose |
可以看到角色部分都為空,但用戶部分是有數據的,但按理說只選了角色表自動進行查詢,應該一條都查不到,代碼里也應該size=0,平時在公司用的Oracle還沒碰到這個問題。
那么假設就是因為這個原因,則SQL里就需要添加不為空篩選了,修改SQL如下:
select
r.tb_id,
r.role_code,
r.role_name,
r.role_desc
from t_sys_user u
left join t_sys_bind_user_role ur on ur.user_tb_id = u.tb_id
left join t_sys_role r on r.tb_id = ur.role_tb_id
where r.tb_id is not null -- 添加了不為空篩選
and u.tb_id = #{sysUserTbId}
DEBUG項目,size=0,問題解決。