Loading

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,问题解决。

posted @ 2021-04-26 19:10  mahoshojo  阅读(3062)  评论(1编辑  收藏  举报