太重视名誉正是一般人最常犯的错误——叔本华

分享自己写的一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
void testWhereRelation() {
LambdaQueryWrapper<UserInfo> wrapper = Database.inList(Wrappers.lambdaQuery(UserInfo.class),
Lists.of(new UserInfo() {{
setName("Jon");
}},
new UserInfo() {{
setEmail("test2@baomidou.com");
}},
new UserInfo() {{
setName("Tom");
}}));
List<UserInfo> userInfos = Database.list(wrapper);
Assertions.assertEquals("Jon", userInfos.get(0).getName());
Assertions.assertEquals("test2@baomidou.com", userInfos.get(1).getEmail());
Assertions.assertEquals("Tom", userInfos.get(2).getName());
}

得到:

1
2
2023-02-27 21:50:34.222 DEBUG 5956 --- [           main] i.g.v.s.p.m.m.d.U.selectList             : ==>  Preparing: SELECT id,name,age,email,version,gmt_deleted FROM user_info WHERE gmt_deleted='2001-01-01 00:00:00' AND ((name IN (?,?) OR email IN (?)))
2023-02-27 21:50:34.236 DEBUG 5956 --- [ main] i.g.v.s.p.m.m.d.U.selectList : ==> Parameters: Jon(String), Tom(String), test2@baomidou.com(String)

简单说明一下:此处是将入参的list获取到类型,根据表字段和list进行遍历,获取lambda进行取值,然后进行in以及or查询

image-20230227220333462

当前的源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@SuppressWarnings("unchecked")
public static <T> LambdaQueryWrapper<T> inList(LambdaQueryWrapper<T> wrapper, List<T> dataList) {
if (Lists.isEmpty(dataList)) {
return wrapper;
}
final Class<T> entityClass = getEntityClass(dataList);
final List<TableFieldInfo> fieldList = TableInfoHelper.getTableInfo(entityClass).getFieldList();
wrapper.nested(w -> Steam.of(fieldList).forEachIdx((tableField, idx) -> {
SFunction<T, ?> getterFunction = (SFunction<T, ?>) LAMBDA_GETTER_CACHE.computeIfAbsent(
entityClass + StringPool.AT + tableField.getProperty(),
property -> {
Method getter = ReflectHelper.getMethod(entityClass,
BeanHelper.GETTER_PREFIX +
tableField.getProperty().substring(0, 1).toUpperCase(Locale.ROOT) +
tableField.getProperty().substring(1));
return LambdaHelper.revert(SFunction.class, getter);
});
final List<?> list = Steam.of(dataList).map(getterFunction).nonNull().toList();
if (idx != 0) {
w.or();
}
w.in(Lists.isNotEmpty(list), getterFunction, list);
}));
return wrapper;
}

完整代码:https://gitee.com/VampireAchao/stream-query/blob/master/stream-plugin/stream-plugin-mybatis-plus/src/main/java/io/github/vampireachao/stream/plugin/mybatisplus/Database.java