mybatis踩坑小记:查询结果集合size为1,但是集合内对象为null

问题描述

在项目中使用mybatis映射的时候; 返回的结果集是List ;查询的结果集List的size是1 ; 然而在调用 list.get(0)的时候; 返回值为 null;

控制台输出 

但是联表的查询SQL语句并没错

那到底是出现了什么问题呢?难道是查询的问题?于是乎我做了这么一个实验。

第一步:执行SQL

在这里插入图片描述
可以看出没有任何结果。然后根据左连接的特性,查询左表的所有数据和右表的匹配的数据。

然后猜想,是不是因为一个巧合,这是一条非空的数据,只是恰巧我要查询的都是空的呢?
然后我补齐查询,再试一次。

在这里插入图片描述

可以看出还真是这样,然后对于我们来说,这条数据是空的,也仅仅是因为我们要查询的字段是空的,但是其他数据都不是空的,所以他把这个数据数据库并没有当作一条空数据来看,还是映射给了我们的对象,导致List的内部有一个空对象,因为list内部是可以支持null的,所以以后在遇到这种问题,先从源头考虑,上面的java代码,纯属搞笑。

在这里插入图片描述

但是这种方式还有问题,你不知道这个集合里面到底有多有条null,那我们怎么办呢?还有一招究极解决办法,我们可以使用java8的Stream流达到直接解决达到目的:

list.parallelStream().filter(Objects::nonNull).collect(Collectors.toList())

还有一个解决方案是

在查询时加一个一定存在的字段比如说主键id
 
修改后: [加一个id;因为id一定存在]
SELECT id , .. ,... FROM  table  where ...= ?
 

查看SQL语句字段跟实体类字段是否能映射上,否则也会导致查询不到数据

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值