别让你的舌头超越你的思想。——第欧根尼
对于mp
的wrapper
,直接使用nested
+or
是可以正确执行的
例如:
1
| Db.list(Wrappers.lambdaQuery(UserInfo.class).or().eq(UserInfo::getName, "Jon"));
|
生成
1 2
| 2023-04-13 22:39:54.858 DEBUG 20668 --- [ main] o.d.s.s.p.m.m.UserInfoMapper.selectList : ==> Preparing: SELECT id,name,age,email,version,gmt_deleted FROM user_info WHERE gmt_deleted='2001-01-01 00:00:00' AND (name = ?) 2023-04-13 22:39:54.858 DEBUG 20668 --- [ main] o.d.s.s.p.m.m.UserInfoMapper.selectList : ==> Parameters: Jon(String)
|
这样的技巧可以让我们在循环里拼接or
时,无须考虑是否为第一个元素
例如stream-query
中的封装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public static <W extends AbstractWrapper<T, ?, W>, T, R> W multiOr( W wrapper, Collection<R> dataList, BiConsumer<W, R> biConsumer) { if (Lists.isEmpty(dataList)) { return Database.notActive(wrapper); } return wrapper.nested(w -> dataList.forEach(data -> biConsumer.accept(w.or(), data))); }
|
使用起来:
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 26 27 28 29 30 31 32
| val dataList = Lists.of( new UserInfo() { { setName("Jon"); } }, new UserInfo() { { setEmail("test2@baomidou.com"); } }, new UserInfo() { { setName("Tom"); } }); val wrapper = WrapperHelper.multiOr( Wrappers.lambdaQuery(UserInfo.class), dataList, (w, data) -> { w.eq(Objects.nonNull(data.getEmail()), UserInfo::getEmail, data.getEmail()) .eq(StringUtils.isNotBlank(data.getName()), UserInfo::getName, data.getName()); });
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());
|