SimpleQuery优化

2021-12-25

java

做老实人,说老实话,干老实事,就是实事求是。——邓小平

今天又给Mybatis-Plus贡献了代码

https://gitee.com/baomidou/mybatis-plus/pulls/198

优化SimpleQuery,处理了值为空的情况:

之前的情况:

假设数据库中表数据:

id name
1 ruben
2 null

我们构建一个Enitity(向miemie大佬致敬)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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进行查询

1
Map<Long, String> idNameMap = SimpleQuery.map(Wrappers.lambdaQuery(), Entity::getId, Entity::getName);

期望的数据格式如下:

输入图片说明

这样我就可以通过idNameMap.get(1L)获取到id1L对应的表数据中name字段的值,非常便利

但是如果是之前的版本,则会抛出NullPointerException(下方简称NPE)

输入图片说明

原因是因为默认使用Collectors#toMap这个函数

输入图片说明

它调用的是HashMap#merge

输入图片说明

其中判断了如果value为空,则抛出NPE

输入图片说明

而此处我期望的数据,它是允许namenull

因此我进行了一点小修改:

输入图片说明

输入图片说明

然后再次执行,成功得到我们期望的值

输入图片说明

还有一处修改,也是相同的道理,我期望得到如下结果:

这里获取到的mapkey为表中的namevalue则是对应keyname相同的数据组成的集合

为了方便测试,我再新增了一条数据:

1
2
3
4
5
6
// SqlHelper#getMapper是根据`entity`获取对应`mapper`的方法
BaseMapper<Entity> mapper = SqlHelper.getMapper(Entity.class);
Entity entity = new Entity();
entity.setId(3L);
entity.setName("ruben");
mapper.insert(entity);

开始查询:

1
Map<String, List<Entity>> nameUsersMap = SimpleQuery.group(Wrappers.lambdaQuery(), Entity::getName);

期望结果如下:

输入图片说明

实际还是抛出了NPE

输入图片说明

这是因为原来使用的Collectors#groupingBy,它也对key进行了判空处理,实际上我们并不想丢掉这些数据

输入图片说明

输入图片说明

因为可以根据nameUsersMap.get(null)去顺带获取namenull的数据,最起码,个别namenull的数据不能影响我取其他的值,说白了就是你别给我抛出NPE

所以我又施展了一点小修改:

输入图片说明

测试成功通过!

输入图片说明