all elements are null


今天用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 email 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,問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM