做老实人,说老实话,干老实事,就是实事求是。——邓小平
今天又给Mybatis-Plus
贡献了代码
https://gitee.com/baomidou/mybatis-plus/pulls/198
优化SimpleQuery
,处理了值为空的情况:
之前的情况:
假设数据库中表数据:
id | name |
1 | ruben |
2 | null |
我们构建一个Enitity
(向miemie
大佬致敬)
package com.baomidou.mybatisplus.test.rewrite; import lombok.Data; import java.io.Serializable; /** * @author miemie * @since 2020-06-23 */ @Data public class Entity implements Serializable { private static final long serialVersionUID = 6962439201546719734L; private Long id; private String name; }
使用SimplerQuery
进行查询
Map<Long, String> idNameMap = SimpleQuery.map(Wrappers.lambdaQuery(), Entity::getId, Entity::getName);
期望的数据格式如下:
这样我就可以通过idNameMap.get(1L)
获取到id
为1L
对应的表数据中name
字段的值,非常便利
但是如果是之前的版本,则会抛出NullPointerException
(下方简称NPE
)
原因是因为默认使用Collectors#toMap
这个函数
它调用的是HashMap#merge
其中判断了如果value
为空,则抛出NPE
而此处我期望的数据,它是允许name
为null
的
因此我进行了一点小修改:
然后再次执行,成功得到我们期望的值
还有一处修改,也是相同的道理,我期望得到如下结果:
这里获取到的map
,key
为表中的name
,value
则是对应key
中name
相同的数据组成的集合
为了方便测试,我再新增了一条数据:
// SqlHelper#getMapper是根据`entity`获取对应`mapper`的方法 BaseMapper<Entity> mapper = SqlHelper.getMapper(Entity.class); Entity entity = new Entity(); entity.setId(3L); entity.setName("ruben"); mapper.insert(entity);
开始查询:
Map<String, List<Entity>> nameUsersMap = SimpleQuery.group(Wrappers.lambdaQuery(), Entity::getName);
期望结果如下:
实际还是抛出了NPE
:
这是因为原来使用的Collectors#groupingBy
,它也对key
进行了判空处理,实际上我们并不想丢掉这些数据
因为可以根据nameUsersMap.get(null)
去顺带获取name
为null
的数据,最起码,个别name
为null
的数据不能影响我取其他的值,说白了就是你别给我抛出NPE
…
所以我又施展了一点小修改:
测试成功通过!