From d53277642cd3680db204014338f963797fd46cf2 Mon Sep 17 00:00:00 2001 From: Cason <1125193113@qq.com> Date: Thu, 8 Jun 2023 21:44:32 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9QueryCondition=E7=9A=84eq?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81TypeHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mybatisplus/QueryCondition.java | 45 ++++++++- .../handler/AbstractJsonFieldHandler.java | 8 +- .../mybatisplus/JsonFieldHandlerTest.java | 4 +- .../mybatisplus/QueryConditionTest.java | 95 +++++++++++++++++++ 4 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java index 6cd68927..f5d4f694 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java @@ -17,13 +17,25 @@ package org.dromara.streamquery.stream.plugin.mybatisplus; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.apache.ibatis.mapping.ResultMap; +import org.apache.ibatis.mapping.ResultMapping; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.TypeHandler; +import org.dromara.streamquery.stream.core.bean.BeanHelper; +import org.dromara.streamquery.stream.core.lambda.LambdaExecutable; +import org.dromara.streamquery.stream.core.lambda.LambdaHelper; import org.dromara.streamquery.stream.core.optional.Opp; +import org.dromara.streamquery.stream.plugin.mybatisplus.engine.handler.AbstractJsonFieldHandler; import java.util.Collection; import java.util.Objects; +import java.util.Optional; /** * QueryCondition class. @@ -80,7 +92,38 @@ public class QueryCondition extends LambdaQueryWrapper { * @return a {@link QueryCondition} object */ public > QueryCondition eq(SFunction column, R data) { - super.eq(Objects.nonNull(data), column, data); + if (Objects.isNull(data)) { + return this; + } + LambdaExecutable executable = LambdaHelper.resolve(column); + String name = BeanHelper.getPropertyName(executable.getName()); + TableInfo tableInfo = TableInfoHelper.getTableInfo(executable.getClazz()); + Configuration configuration = tableInfo.getConfiguration(); + ResultMap resultMap =configuration.getResultMap(tableInfo.getResultMap()); + + Optional fieldInfo = tableInfo.getFieldList().stream().filter(field -> field.getProperty().equals(name)).findFirst(); + Optional optionalJson = fieldInfo.flatMap(field -> { + Optional resultMappingOpt = resultMap.getResultMappings().stream() + .filter(resultMapping -> field.getProperty().equals(resultMapping.getProperty())) + .findFirst(); + + return resultMappingOpt.flatMap(resultMapping -> { + TypeHandler typeHandler = resultMapping.getTypeHandler(); + if (typeHandler instanceof AbstractJsonFieldHandler) { + AbstractJsonFieldHandler handler = (AbstractJsonFieldHandler) typeHandler; + return Optional.of(handler.toJson(data, tableInfo, field)); + } + return Optional.empty(); + }); + }); + if (optionalJson.isPresent()) { + String json = optionalJson.get(); + super.eq(column, json); + + } else { + super.eq(column,data); + } + return this; } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/handler/AbstractJsonFieldHandler.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/handler/AbstractJsonFieldHandler.java index 9533e0f0..0a3d03a6 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/handler/AbstractJsonFieldHandler.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/handler/AbstractJsonFieldHandler.java @@ -47,16 +47,16 @@ public abstract class AbstractJsonFieldHandler extends AbstractJsonTypeHandle } @Override - protected T parse(String json) { + public T parse(String json) { return parse(json, tableInfo, fieldInfo); } @Override - protected String toJson(T obj) { + public String toJson(T obj) { return toJson(obj, tableInfo, fieldInfo); } - protected abstract T parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo); + public abstract T parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo); - protected abstract String toJson(T obj, TableInfo tableInfo, TableFieldInfo fieldInfo); + public abstract String toJson(T obj, TableInfo tableInfo, TableFieldInfo fieldInfo); } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/JsonFieldHandlerTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/JsonFieldHandlerTest.java index 8642b881..9cb70d61 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/JsonFieldHandlerTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/JsonFieldHandlerTest.java @@ -72,14 +72,14 @@ class JsonFieldHandlerTest { ObjectMapper objectMapper = new ObjectMapper(); @Override - protected Object parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo) { + public Object parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo) { Class fieldType = fieldInfo.getField().getType(); return ((SerSupp) (() -> objectMapper.readValue(json, fieldType))).get(); } @Override @SneakyThrows - protected String toJson(Object obj, TableInfo tableInfo, TableFieldInfo fieldInfo) { + public String toJson(Object obj, TableInfo tableInfo, TableFieldInfo fieldInfo) { return objectMapper.writeValueAsString(obj); } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java new file mode 100644 index 00000000..4bb096c7 --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java @@ -0,0 +1,95 @@ +package org.dromara.streamquery.stream.plugin.mybatisplus; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTest; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import lombok.SneakyThrows; +import lombok.val; +import org.apache.ibatis.session.SqlSessionFactory; +import org.dromara.streamquery.stream.core.collection.Lists; +import org.dromara.streamquery.stream.core.lambda.function.SerSupp; +import org.dromara.streamquery.stream.plugin.mybatisplus.engine.handler.AbstractJsonFieldHandler; +import org.dromara.streamquery.stream.plugin.mybatisplus.engine.mapper.IGenerateMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Cason + * @date 2023-06-08 21:32 + */ +@MybatisPlusTest +public class QueryConditionTest { + @BeforeEach + void init(@Autowired SqlSessionFactory sqlSessionFactory) { + Database.buildMapper(sqlSessionFactory.getConfiguration(), UserInfoWithJsonName.class); + } + + @Test + void test() { + Name name = new Name(); + name.setUsername("VampireAchao"); + name.setNickname("阿超"); + + UserInfoWithJsonName user = new UserInfoWithJsonName(); + user.setName(name); + Database.saveFewSql(Lists.of(user)); + Database.updateFewSql(Lists.of(user)); + + QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class).eq(UserInfoWithJsonName::getName, name); + val list = Database.list(wrapper); + + // Assert that the query returned exactly one result + assertEquals(1, list.size(), "Query should return exactly one result"); + + // Assert that the returned user's name matches the expected name + assertEquals(name, list.get(0).getName(), "Returned user's name should match the expected name"); + + } + + public static class JsonFieldHandler extends AbstractJsonFieldHandler { + + ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public Object parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo) { + Class fieldType = fieldInfo.getField().getType(); + return ((SerSupp) (() -> objectMapper.readValue(json, fieldType))).get(); + } + + @Override + @SneakyThrows + public String toJson(Object obj, TableInfo tableInfo, TableFieldInfo fieldInfo) { + return objectMapper.writeValueAsString(obj); + } + } + + @Data + @TableName(value = "user_info", autoResultMap = true) + static class UserInfoWithJsonName implements IGenerateMapper { + private Long id; + + @TableField(typeHandler = JsonFieldHandler.class) + private Name name; + } + + @Data + static class Name implements Serializable, Comparable { + private String username; + private String nickname; + + @Override + public int compareTo(Name o) { + + return this.username.compareTo(o.username); + } + } +} -- Gitee From 343c4a347abed0a0fdae5798a08d1cd7eed94365 Mon Sep 17 00:00:00 2001 From: Cason <1125193113@qq.com> Date: Fri, 9 Jun 2023 20:02:25 +0800 Subject: [PATCH 2/4] =?UTF-8?q?1.=E6=8A=BD=E5=8F=96=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=AF=AD=E5=8F=A5=E5=8F=82=E6=95=B0=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E4=B8=BA=E5=85=B1=E7=94=A8=E6=96=B9=E6=B3=95=E3=80=82?= =?UTF-8?q?=202.=E8=A1=A5=E5=85=85=E4=BA=86in=EF=BC=8CactiveIn=EF=BC=8Cact?= =?UTF-8?q?iveEq=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81typeHandler=E3=80=82?= =?UTF-8?q?=203.=E8=A1=A5=E5=85=A8=E4=BA=86=E7=9B=B8=E5=85=B3=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=85=A8=E9=83=A8=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mybatisplus/QueryCondition.java | 88 +++++++++----- .../mybatisplus/QueryConditionTest.java | 111 +++++++++++++++++- 2 files changed, 163 insertions(+), 36 deletions(-) diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java index f5d4f694..b4b02c97 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java @@ -31,10 +31,13 @@ import org.dromara.streamquery.stream.core.bean.BeanHelper; import org.dromara.streamquery.stream.core.lambda.LambdaExecutable; import org.dromara.streamquery.stream.core.lambda.LambdaHelper; import org.dromara.streamquery.stream.core.optional.Opp; +import org.dromara.streamquery.stream.core.stream.Steam; import org.dromara.streamquery.stream.plugin.mybatisplus.engine.handler.AbstractJsonFieldHandler; +import java.util.ArrayList; import java.util.Collection; import java.util.Objects; + import java.util.Optional; /** @@ -95,34 +98,17 @@ public class QueryCondition extends LambdaQueryWrapper { if (Objects.isNull(data)) { return this; } - LambdaExecutable executable = LambdaHelper.resolve(column); - String name = BeanHelper.getPropertyName(executable.getName()); - TableInfo tableInfo = TableInfoHelper.getTableInfo(executable.getClazz()); - Configuration configuration = tableInfo.getConfiguration(); - ResultMap resultMap =configuration.getResultMap(tableInfo.getResultMap()); - - Optional fieldInfo = tableInfo.getFieldList().stream().filter(field -> field.getProperty().equals(name)).findFirst(); - Optional optionalJson = fieldInfo.flatMap(field -> { - Optional resultMappingOpt = resultMap.getResultMappings().stream() - .filter(resultMapping -> field.getProperty().equals(resultMapping.getProperty())) - .findFirst(); - - return resultMappingOpt.flatMap(resultMapping -> { - TypeHandler typeHandler = resultMapping.getTypeHandler(); - if (typeHandler instanceof AbstractJsonFieldHandler) { - AbstractJsonFieldHandler handler = (AbstractJsonFieldHandler) typeHandler; - return Optional.of(handler.toJson(data, tableInfo, field)); - } - return Optional.empty(); - }); - }); - if (optionalJson.isPresent()) { - String json = optionalJson.get(); - super.eq(column, json); - } else { - super.eq(column,data); - } +// Optional optionalJson = convertIfNeed(column, data); +// if (optionalJson.isPresent()) { +// String json = optionalJson.get(); +// super.eq(column, json); +// } else { +// super.eq(column,data); +// } + Opp.of(convertIfNeed(column, data)) + .ifPresent( v -> super.eq(column, v)) + .orElseRun(()->super.eq(column, data)); return this; } @@ -149,7 +135,15 @@ public class QueryCondition extends LambdaQueryWrapper { */ public > QueryCondition in( SFunction column, Collection dataList) { - super.in(CollectionUtils.isNotEmpty(dataList), column, dataList); + + if (CollectionUtils.isEmpty(dataList)) { + super.in(false, column, dataList); + } + Collection jsonList = new ArrayList<>(); + dataList.forEach(v -> convertIfNeed(column, v).ifPresent(jsonList::add)); + Opp.of(jsonList). + ifPresent(list -> super.in( column, list)) + .orElseRun(() ->super.in( column, dataList)); return this; } @@ -175,8 +169,13 @@ public class QueryCondition extends LambdaQueryWrapper { */ public > QueryCondition activeEq( SFunction column, R data) { - Opp.of(data).map(v -> super.eq(column, v)).orElseRun(() -> Database.notActive(this)); + Opp.of(data) + .map(v -> Opp.of(convertIfNeed(column, data)) + .ifPresent( json -> super.eq(column, json)) + .orElseRun(()->super.eq(column, data))) + .orElseRun(() -> Database.notActive(this)); return this; + } /** @@ -201,7 +200,36 @@ public class QueryCondition extends LambdaQueryWrapper { */ public > QueryCondition activeIn( SFunction column, Collection dataList) { - Opp.ofColl(dataList).map(v -> super.in(column, v)).orElseRun(() -> Database.notActive(this)); + Opp.ofColl(dataList).map(list -> { + Collection jsonList = new ArrayList<>(); + dataList.forEach(v -> convertIfNeed(column, v).ifPresent(jsonList::add)); + return Opp.of(jsonList) + .ifPresent(vList -> super.in( column, vList)) + .orElseRun(() -> super.in( column, dataList)); + }).orElseRun(() -> Database.notActive(this)); return this; } + + private > Optional convertIfNeed(SFunction column, R data) { + LambdaExecutable executable = LambdaHelper.resolve(column); + String name = BeanHelper.getPropertyName(executable.getName()); + TableInfo tableInfo = TableInfoHelper.getTableInfo(executable.getClazz()); + Configuration configuration = tableInfo.getConfiguration(); + ResultMap resultMap =configuration.getResultMap(tableInfo.getResultMap()); + + Optional fieldInfo = Steam.of(tableInfo.getFieldList()).findFirst(field -> field.getProperty().equals(name)); + return fieldInfo.flatMap(field -> { + Optional resultMappingOpt = Steam.of(resultMap.getResultMappings()) + .findFirst(resultMapping -> field.getProperty().equals(resultMapping.getProperty())); + + return resultMappingOpt.flatMap(resultMapping -> { + TypeHandler typeHandler = resultMapping.getTypeHandler(); + if (typeHandler instanceof AbstractJsonFieldHandler) { + AbstractJsonFieldHandler handler = (AbstractJsonFieldHandler) typeHandler; + return Optional.of(handler.toJson(data, tableInfo, field)); + } + return Optional.empty(); + }); + }); + } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java index 4bb096c7..0ebbafec 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java @@ -19,8 +19,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; /** * @author Cason @@ -34,7 +36,7 @@ public class QueryConditionTest { } @Test - void test() { + void eqTest() { Name name = new Name(); name.setUsername("VampireAchao"); name.setNickname("阿超"); @@ -44,17 +46,114 @@ public class QueryConditionTest { Database.saveFewSql(Lists.of(user)); Database.updateFewSql(Lists.of(user)); - QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class).eq(UserInfoWithJsonName::getName, name); + QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) + .eq(UserInfoWithJsonName::getName, name); val list = Database.list(wrapper); - // Assert that the query returned exactly one result assertEquals(1, list.size(), "Query should return exactly one result"); - - // Assert that the returned user's name matches the expected name assertEquals(name, list.get(0).getName(), "Returned user's name should match the expected name"); } + @Test + void activeEqTest() { + Name name = new Name(); + name.setUsername("Cason"); + name.setNickname("JAY"); + + UserInfoWithJsonName user = new UserInfoWithJsonName(); + user.setName(name); + + Database.saveFewSql(Lists.of(user)); + + QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) + .activeEq(UserInfoWithJsonName::getName, name); + + val list = Database.list(wrapper); + + assertEquals(1, list.size(), "Query should return exactly one result"); + assertEquals(name.getUsername(), list.get(0).getName().getUsername(), "Returned user's username should match the expected username"); + } + + @Test + void InTest() { + Name name1 = new Name(); + name1.setUsername("Cason"); + name1.setNickname("JAY"); + + Name name2 = new Name(); + name2.setUsername("Alice"); + name2.setNickname("AL"); + + Name name3 = new Name(); + name3.setUsername("Bob"); + name3.setNickname("BB"); + + UserInfoWithJsonName user1 = new UserInfoWithJsonName(); + user1.setName(name1); + + UserInfoWithJsonName user2 = new UserInfoWithJsonName(); + user2.setName(name2); + + UserInfoWithJsonName user3 = new UserInfoWithJsonName(); + user3.setName(name3); + + Database.saveFewSql(Lists.of(user1, user2, user3)); + + QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) + .in(UserInfoWithJsonName::getName, Lists.of(name1, name3)); + + val list = Database.list(wrapper); + + assertEquals(2, list.size(), "Query should return exactly two results"); + + List usernames = list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); + + assertTrue(usernames.contains(name1.getUsername()), "Returned users should contain the first expected username"); + assertTrue(usernames.contains(name3.getUsername()), "Returned users should contain the third expected username"); + assertFalse(usernames.contains(name2.getUsername()), "Returned users should not contain the second username"); + } + + @Test + void activeInTest() { + Name name1 = new Name(); + name1.setUsername("Cason"); + name1.setNickname("JAY"); + + Name name2 = new Name(); + name2.setUsername("Alice"); + name2.setNickname("AL"); + + Name name3 = new Name(); + name3.setUsername("Bob"); + name3.setNickname("BB"); + + UserInfoWithJsonName user1 = new UserInfoWithJsonName(); + user1.setName(name1); + + UserInfoWithJsonName user2 = new UserInfoWithJsonName(); + user2.setName(name2); + + UserInfoWithJsonName user3 = new UserInfoWithJsonName(); + user3.setName(name3); + + Database.saveFewSql(Lists.of(user1, user2, user3)); + + QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) + .activeIn(UserInfoWithJsonName::getName, Lists.of(name1, name3)); + + val list = Database.list(wrapper); + + assertEquals(2, list.size(), "Query should return exactly two results"); + + List usernames = list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); + + assertTrue(usernames.contains(name1.getUsername()), "Returned users should contain the first expected username"); + assertTrue(usernames.contains(name3.getUsername()), "Returned users should contain the third expected username"); + assertFalse(usernames.contains(name2.getUsername()), "Returned users should not contain the second username"); + } + + public static class JsonFieldHandler extends AbstractJsonFieldHandler { ObjectMapper objectMapper = new ObjectMapper(); -- Gitee From eb0d3b36ebf10c33289e473cc64ef332b8635166 Mon Sep 17 00:00:00 2001 From: Cason <1125193113@qq.com> Date: Wed, 14 Jun 2023 14:35:46 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E9=87=8D=E6=96=B0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BC=A0=E5=85=A5mapping=E7=9A=84=E6=96=B9=E5=BC=8F=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0Wrapper=E6=94=AF=E6=8C=81TypeHandler=E3=80=82=20?= =?UTF-8?q?=E7=9B=AE=E5=89=8D=E6=94=AF=E6=8C=81LamdaQueryWrapper=E7=9A=84e?= =?UTF-8?q?q=E7=AD=89=E6=93=8D=E4=BD=9C=E7=AC=A6=EF=BC=8Cin=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8Cor=E6=96=B9=E6=B3=95=E5=92=8Cselect=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E3=80=82=20=E7=BC=96=E5=86=99=E4=BA=86=E4=BB=A5?= =?UTF-8?q?=E4=B8=8A=E6=96=B9=E6=B3=95=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=EF=BC=8C=E6=B5=8B=E8=AF=95=E5=85=A8=E9=83=A8=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mybatisplus/QueryCondition.java | 198 ++++++---- .../StreamScannerConfigurer.java | 2 +- .../gitee/issue17BSNV/RevisionTest.java | 46 ++- .../streamquery/gitee/issue17BSNV/Table.java | 25 +- .../gitee/issue17BSNV/UserInfo.java | 19 + .../mybatisplus/QueryConditionTest.java | 363 +++++++++++------- ...isPlusPluginByBasePackagesGeneralTest.java | 3 +- ...leMybatisPlusPluginByBasePackagesTest.java | 3 +- .../annotation/pojo/po/RoleInfo.java | 5 +- .../annotation/pojo/po/UserInfo.java | 9 +- .../annotation/pojo/po/UserRole.java | 3 +- .../annotation/pojo/po/inner/AddressInfo.java | 5 +- 12 files changed, 437 insertions(+), 244 deletions(-) diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java index b4b02c97..30e97133 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java @@ -16,29 +16,30 @@ */ package org.dromara.streamquery.stream.plugin.mybatisplus; +import com.baomidou.mybatisplus.core.conditions.ISqlSegment; +import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.enums.SqlKeyword; +import com.baomidou.mybatisplus.core.enums.WrapperKeyword; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import org.apache.ibatis.mapping.ResultMap; -import org.apache.ibatis.mapping.ResultMapping; -import org.apache.ibatis.session.Configuration; -import org.apache.ibatis.type.TypeHandler; import org.dromara.streamquery.stream.core.bean.BeanHelper; import org.dromara.streamquery.stream.core.lambda.LambdaExecutable; import org.dromara.streamquery.stream.core.lambda.LambdaHelper; import org.dromara.streamquery.stream.core.optional.Opp; import org.dromara.streamquery.stream.core.stream.Steam; -import org.dromara.streamquery.stream.plugin.mybatisplus.engine.handler.AbstractJsonFieldHandler; -import java.util.ArrayList; import java.util.Collection; +import java.util.Map; import java.util.Objects; - import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.stream.Collectors; /** * QueryCondition class. @@ -48,6 +49,30 @@ import java.util.Optional; */ public class QueryCondition extends LambdaQueryWrapper { + String mapping; + + QueryCondition( + T entity, + Class entityClass, + AtomicInteger paramNameSeq, + Map paramNameValuePairs, + MergeSegments mergeSegments, + SharedString paramAlias, + SharedString lastSql, + SharedString sqlComment, + SharedString sqlFirst) { + super.setEntity(entity); + super.setEntityClass(entityClass); + this.paramNameSeq = paramNameSeq; + this.paramNameValuePairs = paramNameValuePairs; + this.expression = mergeSegments; + this.paramAlias = paramAlias; + this.lastSql = lastSql; + this.sqlComment = sqlComment; + this.sqlFirst = sqlFirst; + } + + QueryCondition() {} /** * query. * @@ -64,7 +89,7 @@ public class QueryCondition extends LambdaQueryWrapper { /** * query. * - * @param entityClass a {@link java.lang.Class} object + * @param entityClass a {@link Class} object * @param a T class * @return a {@link QueryCondition} object */ @@ -77,8 +102,8 @@ public class QueryCondition extends LambdaQueryWrapper { /** * eq. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object - * @param data a {@link java.lang.String} object + * @param column a {@link SFunction} object + * @param data a {@link String} object * @return a {@link QueryCondition} object */ public QueryCondition eq(SFunction column, String data) { @@ -89,35 +114,21 @@ public class QueryCondition extends LambdaQueryWrapper { /** * eq. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object + * @param column a {@link SFunction} object * @param data a R object * @param a R class * @return a {@link QueryCondition} object */ public > QueryCondition eq(SFunction column, R data) { - if (Objects.isNull(data)) { - return this; - } - -// Optional optionalJson = convertIfNeed(column, data); -// if (optionalJson.isPresent()) { -// String json = optionalJson.get(); -// super.eq(column, json); -// } else { -// super.eq(column,data); -// } - Opp.of(convertIfNeed(column, data)) - .ifPresent( v -> super.eq(column, v)) - .orElseRun(()->super.eq(column, data)); - + super.eq(Objects.nonNull(data), column, data); return this; } /** * like. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object - * @param data a {@link java.lang.String} object + * @param column a {@link SFunction} object + * @param data a {@link String} object * @return a {@link QueryCondition} object */ public QueryCondition like(SFunction column, String data) { @@ -128,30 +139,23 @@ public class QueryCondition extends LambdaQueryWrapper { /** * in. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object - * @param dataList a {@link java.util.Collection} object + * @param column a {@link SFunction} object + * @param dataList a {@link Collection} object * @param a R class * @return a {@link QueryCondition} object */ public > QueryCondition in( SFunction column, Collection dataList) { - - if (CollectionUtils.isEmpty(dataList)) { - super.in(false, column, dataList); - } - Collection jsonList = new ArrayList<>(); - dataList.forEach(v -> convertIfNeed(column, v).ifPresent(jsonList::add)); - Opp.of(jsonList). - ifPresent(list -> super.in( column, list)) - .orElseRun(() ->super.in( column, dataList)); + this.mapping = getMapping(column); + super.in(CollectionUtils.isNotEmpty(dataList), column, dataList); return this; } /** * activeEq. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object - * @param data a {@link java.lang.String} object + * @param column a {@link SFunction} object + * @param data a {@link String} object * @return a {@link QueryCondition} object */ public QueryCondition activeEq(SFunction column, String data) { @@ -162,27 +166,22 @@ public class QueryCondition extends LambdaQueryWrapper { /** * activeEq. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object + * @param column a {@link SFunction} object * @param data a R object * @param a R class * @return a {@link QueryCondition} object */ public > QueryCondition activeEq( SFunction column, R data) { - Opp.of(data) - .map(v -> Opp.of(convertIfNeed(column, data)) - .ifPresent( json -> super.eq(column, json)) - .orElseRun(()->super.eq(column, data))) - .orElseRun(() -> Database.notActive(this)); + Opp.of(data).map(v -> super.eq(column, v)).orElseRun(() -> Database.notActive(this)); return this; - } /** * activeLike. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object - * @param data a {@link java.lang.String} object + * @param column a {@link SFunction} object + * @param data a {@link String} object * @return a {@link QueryCondition} object */ public QueryCondition activeLike(SFunction column, String data) { @@ -193,43 +192,88 @@ public class QueryCondition extends LambdaQueryWrapper { /** * activeIn. * - * @param column a {@link com.baomidou.mybatisplus.core.toolkit.support.SFunction} object - * @param dataList a {@link java.util.Collection} object + * @param column a {@link SFunction} object + * @param dataList a {@link Collection} object * @param a R class * @return a {@link QueryCondition} object */ public > QueryCondition activeIn( SFunction column, Collection dataList) { - Opp.ofColl(dataList).map(list -> { - Collection jsonList = new ArrayList<>(); - dataList.forEach(v -> convertIfNeed(column, v).ifPresent(jsonList::add)); - return Opp.of(jsonList) - .ifPresent(vList -> super.in( column, vList)) - .orElseRun(() -> super.in( column, dataList)); - }).orElseRun(() -> Database.notActive(this)); + this.mapping = getMapping(column); + Opp.ofColl(dataList).map(v -> super.in(column, v)).orElseRun(() -> Database.notActive(this)); return this; } - private > Optional convertIfNeed(SFunction column, R data) { + @Override + protected LambdaQueryWrapper addCondition( + boolean condition, SFunction column, SqlKeyword sqlKeyword, Object val) { + + this.mapping = getMapping(column); + return this.maybeDo( + condition, + () -> { + this.appendSqlSegments( + this.columnToSqlSegment(column), + sqlKeyword, + () -> { + return this.formatParam(this.mapping, val); + }); + }); + } + + private String getMapping(SFunction column) { LambdaExecutable executable = LambdaHelper.resolve(column); String name = BeanHelper.getPropertyName(executable.getName()); TableInfo tableInfo = TableInfoHelper.getTableInfo(executable.getClazz()); - Configuration configuration = tableInfo.getConfiguration(); - ResultMap resultMap =configuration.getResultMap(tableInfo.getResultMap()); - - Optional fieldInfo = Steam.of(tableInfo.getFieldList()).findFirst(field -> field.getProperty().equals(name)); - return fieldInfo.flatMap(field -> { - Optional resultMappingOpt = Steam.of(resultMap.getResultMappings()) - .findFirst(resultMapping -> field.getProperty().equals(resultMapping.getProperty())); - - return resultMappingOpt.flatMap(resultMapping -> { - TypeHandler typeHandler = resultMapping.getTypeHandler(); - if (typeHandler instanceof AbstractJsonFieldHandler) { - AbstractJsonFieldHandler handler = (AbstractJsonFieldHandler) typeHandler; - return Optional.of(handler.toJson(data, tableInfo, field)); + + return Opp.of( + Steam.of(tableInfo.getFieldList()) + .findFirst(field -> field.getProperty().equals(name)) + .flatMap(field -> Optional.ofNullable(field.getTypeHandler()))) + .map(v -> "typeHandler = " + v.getName()) + .orElse(null); + } + + @Override + protected ISqlSegment inExpression(Collection value) { + return CollectionUtils.isEmpty(value) + ? () -> { + return "()"; } - return Optional.empty(); - }); - }); + : () -> { + return (String) + value.stream() + .map( + (i) -> { + return this.formatParam(this.mapping, i); + }) + .collect(Collectors.joining(",", "(", ")")); + }; + } + + @Override + protected LambdaQueryWrapper addNestedCondition( + boolean condition, Consumer> consumer) { + return this.maybeDo( + condition, + () -> { + QueryCondition instance = this.instance(); + consumer.accept(instance); + this.appendSqlSegments(WrapperKeyword.APPLY, instance); + }); + } + + @Override + protected QueryCondition instance() { + return new QueryCondition<>( + this.getEntity(), + this.getEntityClass(), + this.paramNameSeq, + this.paramNameValuePairs, + new MergeSegments(), + this.paramAlias, + SharedString.emptyString(), + SharedString.emptyString(), + SharedString.emptyString()); } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java index 7283b643..12d74910 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java @@ -68,7 +68,7 @@ public class StreamScannerConfigurer implements BeanFactoryPostProcessor { public void setInterfaceClass(Class interfaceClass) { this.interfaceClass = interfaceClass; } - + public void setEmptyBasePackages(boolean emptyBasePackages) { this.emptyBasePackages = emptyBasePackages; } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/RevisionTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/RevisionTest.java index 55209f4e..5535c252 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/RevisionTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/RevisionTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package issue.org.dromara.streamquery.gitee.issue17BSNV; import org.dromara.streamquery.stream.core.collection.Lists; @@ -20,20 +36,20 @@ import java.util.List; @EnableMybatisPlusPlugin class RevisionTest extends AbstractMybatisPlusTestApplication { - @Test - void testExecute() { - UserInfo entity = new UserInfo(); - entity.setName("cat"); - entity.setAge(20); - entity.setEmail("myEmail"); - UserInfo userInfo = new UserInfo(); - userInfo.setName("ruben"); - List list = Arrays.asList(userInfo, entity); - long effectRows = Database.execute(UserInfo.class, (IMapper m) -> m.saveOneSql(list)); - Assertions.assertEquals(2, effectRows); - Assertions.assertEquals(7, Database.count(UserInfo.class)); + @Test + void testExecute() { + UserInfo entity = new UserInfo(); + entity.setName("cat"); + entity.setAge(20); + entity.setEmail("myEmail"); + UserInfo userInfo = new UserInfo(); + userInfo.setName("ruben"); + List list = Arrays.asList(userInfo, entity); + long effectRows = Database.execute(UserInfo.class, (IMapper m) -> m.saveOneSql(list)); + Assertions.assertEquals(2, effectRows); + Assertions.assertEquals(7, Database.count(UserInfo.class)); - Assertions.assertEquals( - 0L, Database.execute(UserInfo.class, (IMapper m) -> m.saveOneSql(Lists.empty()))); - } + Assertions.assertEquals( + 0L, Database.execute(UserInfo.class, (IMapper m) -> m.saveOneSql(Lists.empty()))); + } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/Table.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/Table.java index de4929df..a44edca8 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/Table.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/Table.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package issue.org.dromara.streamquery.gitee.issue17BSNV; import com.baomidou.mybatisplus.annotation.TableName; @@ -10,9 +26,6 @@ import java.lang.annotation.*; @Documented @TableName public @interface Table { - @AliasFor( - annotation = TableName.class, - attribute = "value" - ) - String value() default ""; -} \ No newline at end of file + @AliasFor(annotation = TableName.class, attribute = "value") + String value() default ""; +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/UserInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/UserInfo.java index 4a0e261b..75de8594 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/UserInfo.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/issue/org/dromara/streamquery/gitee/issue17BSNV/UserInfo.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package issue.org.dromara.streamquery.gitee.issue17BSNV; import com.baomidou.mybatisplus.annotation.IdType; @@ -12,11 +28,14 @@ import java.time.LocalDateTime; @Table(value = "user_info") public class UserInfo implements IGenerateMapper { private static final long serialVersionUID = -7219188882388819210L; + @TableId(value = "id", type = IdType.AUTO) private Long id; + private String name; private Integer age; private String email; + @TableLogic(value = "'2001-01-01 00:00:00'", delval = "NOW()") private LocalDateTime gmtDeleted; } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java index 0ebbafec..8a8b62fa 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java @@ -1,7 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.dromara.streamquery.stream.plugin.mybatisplus; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTest; @@ -30,165 +47,251 @@ import static org.junit.jupiter.api.Assertions.*; */ @MybatisPlusTest public class QueryConditionTest { - @BeforeEach - void init(@Autowired SqlSessionFactory sqlSessionFactory) { - Database.buildMapper(sqlSessionFactory.getConfiguration(), UserInfoWithJsonName.class); - } - - @Test - void eqTest() { - Name name = new Name(); - name.setUsername("VampireAchao"); - name.setNickname("阿超"); + @BeforeEach + void init(@Autowired SqlSessionFactory sqlSessionFactory) { + Database.buildMapper(sqlSessionFactory.getConfiguration(), UserInfoWithJsonName.class); + } + + @Test + void eqTest() { + Name name = new Name(); + name.setUsername("VampireAchao"); + name.setNickname("阿超"); + + UserInfoWithJsonName user = new UserInfoWithJsonName(); + user.setName(name); + Database.saveFewSql(Lists.of(user)); + Database.updateFewSql(Lists.of(user)); + + QueryCondition wrapper = + QueryCondition.query(UserInfoWithJsonName.class).eq(UserInfoWithJsonName::getName, name); + val list = Database.list(wrapper); + + assertEquals(1, list.size(), "Query should return exactly one result"); + assertEquals( + name, list.get(0).getName(), "Returned user's name should match the expected name"); + } + + @Test + void activeEqTest() { + Name name = new Name(); + name.setUsername("Cason"); + name.setNickname("JAY"); - UserInfoWithJsonName user = new UserInfoWithJsonName(); - user.setName(name); - Database.saveFewSql(Lists.of(user)); - Database.updateFewSql(Lists.of(user)); + UserInfoWithJsonName user = new UserInfoWithJsonName(); + user.setName(name); - QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) - .eq(UserInfoWithJsonName::getName, name); - val list = Database.list(wrapper); + Database.saveFewSql(Lists.of(user)); - assertEquals(1, list.size(), "Query should return exactly one result"); - assertEquals(name, list.get(0).getName(), "Returned user's name should match the expected name"); + QueryCondition wrapper = + QueryCondition.query(UserInfoWithJsonName.class) + .activeEq(UserInfoWithJsonName::getName, name); + + val list = Database.list(wrapper); + + assertEquals(1, list.size(), "Query should return exactly one result"); + assertEquals( + name.getUsername(), + list.get(0).getName().getUsername(), + "Returned user's username should match the expected username"); + } + + @Test + void orTest() { + Name name1 = new Name(); + name1.setUsername("Cason"); + name1.setNickname("JAY"); + + Name name2 = new Name(); + name2.setUsername("Alice"); + name2.setNickname("AL"); + + Name name3 = new Name(); + name3.setUsername("Bob"); + name3.setNickname("BB"); + + UserInfoWithJsonName user1 = new UserInfoWithJsonName(); + user1.setName(name1); + + UserInfoWithJsonName user2 = new UserInfoWithJsonName(); + user2.setName(name2); + + UserInfoWithJsonName user3 = new UserInfoWithJsonName(); + user3.setName(name3); + + Database.saveFewSql(Lists.of(user1, user2, user3)); - } + QueryCondition wrapper = + (QueryCondition) + QueryCondition.query(UserInfoWithJsonName.class) + .in(UserInfoWithJsonName::getName, Lists.of(name1, name3)) + .or(i -> i.eq(UserInfoWithJsonName::getName, user2.getName())); - @Test - void activeEqTest() { - Name name = new Name(); - name.setUsername("Cason"); - name.setNickname("JAY"); + val list = Database.list(wrapper); - UserInfoWithJsonName user = new UserInfoWithJsonName(); - user.setName(name); + assertEquals(3, list.size(), "Query should return exactly two results"); - Database.saveFewSql(Lists.of(user)); + List usernames = + list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); - QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) - .activeEq(UserInfoWithJsonName::getName, name); + assertTrue( + usernames.contains(name1.getUsername()), + "Returned users should contain the first expected username"); + assertTrue( + usernames.contains(name3.getUsername()), + "Returned users should contain the third expected username"); + assertTrue( + usernames.contains(name2.getUsername()), + "Returned users should not contain the second username"); + } + + @Test + void InTest() { + Name name1 = new Name(); + name1.setUsername("Cason"); + name1.setNickname("JAY"); + + Name name2 = new Name(); + name2.setUsername("Alice"); + name2.setNickname("AL"); + + Name name3 = new Name(); + name3.setUsername("Bob"); + name3.setNickname("BB"); + + UserInfoWithJsonName user1 = new UserInfoWithJsonName(); + user1.setName(name1); - val list = Database.list(wrapper); + UserInfoWithJsonName user2 = new UserInfoWithJsonName(); + user2.setName(name2); + + UserInfoWithJsonName user3 = new UserInfoWithJsonName(); + user3.setName(name3); + + Database.saveFewSql(Lists.of(user1, user2, user3)); + + QueryCondition wrapper = + QueryCondition.query(UserInfoWithJsonName.class) + .activeIn(UserInfoWithJsonName::getName, Lists.of(name1, name3)); + + val list = Database.list(wrapper); - assertEquals(1, list.size(), "Query should return exactly one result"); - assertEquals(name.getUsername(), list.get(0).getName().getUsername(), "Returned user's username should match the expected username"); - } + assertEquals(2, list.size(), "Query should return exactly two results"); - @Test - void InTest() { - Name name1 = new Name(); - name1.setUsername("Cason"); - name1.setNickname("JAY"); + List usernames = + list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); - Name name2 = new Name(); - name2.setUsername("Alice"); - name2.setNickname("AL"); + assertTrue( + usernames.contains(name1.getUsername()), + "Returned users should contain the first expected username"); + assertTrue( + usernames.contains(name3.getUsername()), + "Returned users should contain the third expected username"); + assertFalse( + usernames.contains(name2.getUsername()), + "Returned users should not contain the second username"); + } + + @Test + void activeInTest() { + Name name1 = new Name(); + name1.setUsername("Cason"); + name1.setNickname("JAY"); + + Name name2 = new Name(); + name2.setUsername("Alice"); + name2.setNickname("AL"); - Name name3 = new Name(); - name3.setUsername("Bob"); - name3.setNickname("BB"); + Name name3 = new Name(); + name3.setUsername("Bob"); + name3.setNickname("BB"); - UserInfoWithJsonName user1 = new UserInfoWithJsonName(); - user1.setName(name1); + UserInfoWithJsonName user1 = new UserInfoWithJsonName(); + user1.setName(name1); - UserInfoWithJsonName user2 = new UserInfoWithJsonName(); - user2.setName(name2); + UserInfoWithJsonName user2 = new UserInfoWithJsonName(); + user2.setName(name2); - UserInfoWithJsonName user3 = new UserInfoWithJsonName(); - user3.setName(name3); + UserInfoWithJsonName user3 = new UserInfoWithJsonName(); + user3.setName(name3); - Database.saveFewSql(Lists.of(user1, user2, user3)); + Database.saveFewSql(Lists.of(user1, user2, user3)); + + QueryCondition wrapper = + QueryCondition.query(UserInfoWithJsonName.class) + .activeIn(UserInfoWithJsonName::getName, Lists.of(name1, name3)); + + val list = Database.list(wrapper); + + assertEquals(2, list.size(), "Query should return exactly two results"); + + List usernames = + list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); + + assertTrue( + usernames.contains(name1.getUsername()), + "Returned users should contain the first expected username"); + assertTrue( + usernames.contains(name3.getUsername()), + "Returned users should contain the third expected username"); + assertFalse( + usernames.contains(name2.getUsername()), + "Returned users should not contain the second username"); + } + + @Test + void selectTest() { + Name name = new Name(); + name.setUsername("VampireAchao"); + name.setNickname("阿超"); - QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) - .in(UserInfoWithJsonName::getName, Lists.of(name1, name3)); + UserInfoWithJsonName user = new UserInfoWithJsonName(); + user.setName(name); + Database.saveFewSql(Lists.of(user)); + Database.updateFewSql(Lists.of(user)); - val list = Database.list(wrapper); + LambdaQueryWrapper wrapper = + QueryCondition.query(UserInfoWithJsonName.class) + .select(UserInfoWithJsonName::getName) + .eq(UserInfoWithJsonName::getName, name); + val list = Database.list(wrapper); + } - assertEquals(2, list.size(), "Query should return exactly two results"); + public static class JsonFieldHandler extends AbstractJsonFieldHandler { - List usernames = list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); + ObjectMapper objectMapper = new ObjectMapper(); - assertTrue(usernames.contains(name1.getUsername()), "Returned users should contain the first expected username"); - assertTrue(usernames.contains(name3.getUsername()), "Returned users should contain the third expected username"); - assertFalse(usernames.contains(name2.getUsername()), "Returned users should not contain the second username"); + @Override + public Object parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo) { + Class fieldType = fieldInfo.getField().getType(); + return ((SerSupp) (() -> objectMapper.readValue(json, fieldType))).get(); } - @Test - void activeInTest() { - Name name1 = new Name(); - name1.setUsername("Cason"); - name1.setNickname("JAY"); - - Name name2 = new Name(); - name2.setUsername("Alice"); - name2.setNickname("AL"); - - Name name3 = new Name(); - name3.setUsername("Bob"); - name3.setNickname("BB"); - - UserInfoWithJsonName user1 = new UserInfoWithJsonName(); - user1.setName(name1); - - UserInfoWithJsonName user2 = new UserInfoWithJsonName(); - user2.setName(name2); - - UserInfoWithJsonName user3 = new UserInfoWithJsonName(); - user3.setName(name3); - - Database.saveFewSql(Lists.of(user1, user2, user3)); - - QueryCondition wrapper = QueryCondition.query(UserInfoWithJsonName.class) - .activeIn(UserInfoWithJsonName::getName, Lists.of(name1, name3)); - - val list = Database.list(wrapper); - - assertEquals(2, list.size(), "Query should return exactly two results"); - - List usernames = list.stream().map(user -> user.getName().getUsername()).collect(Collectors.toList()); - - assertTrue(usernames.contains(name1.getUsername()), "Returned users should contain the first expected username"); - assertTrue(usernames.contains(name3.getUsername()), "Returned users should contain the third expected username"); - assertFalse(usernames.contains(name2.getUsername()), "Returned users should not contain the second username"); + @Override + @SneakyThrows + public String toJson(Object obj, TableInfo tableInfo, TableFieldInfo fieldInfo) { + return objectMapper.writeValueAsString(obj); } + } + @Data + @TableName(value = "user_info", autoResultMap = true) + static class UserInfoWithJsonName implements IGenerateMapper { + private Long id; - public static class JsonFieldHandler extends AbstractJsonFieldHandler { - - ObjectMapper objectMapper = new ObjectMapper(); - - @Override - public Object parse(String json, TableInfo tableInfo, TableFieldInfo fieldInfo) { - Class fieldType = fieldInfo.getField().getType(); - return ((SerSupp) (() -> objectMapper.readValue(json, fieldType))).get(); - } - - @Override - @SneakyThrows - public String toJson(Object obj, TableInfo tableInfo, TableFieldInfo fieldInfo) { - return objectMapper.writeValueAsString(obj); - } - } - - @Data - @TableName(value = "user_info", autoResultMap = true) - static class UserInfoWithJsonName implements IGenerateMapper { - private Long id; - - @TableField(typeHandler = JsonFieldHandler.class) - private Name name; - } + @TableField(typeHandler = JsonFieldHandler.class) + private Name name; + } - @Data - static class Name implements Serializable, Comparable { - private String username; - private String nickname; + @Data + static class Name implements Serializable, Comparable { + private String username; + private String nickname; - @Override - public int compareTo(Name o) { + @Override + public int compareTo(Name o) { - return this.username.compareTo(o.username); - } + return this.username.compareTo(o.username); } + } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesGeneralTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesGeneralTest.java index 5600c7f7..d02ca019 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesGeneralTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesGeneralTest.java @@ -35,7 +35,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; * @author KamTo Hung */ @EnableAutoConfiguration -@EnableMybatisPlusPlugin(basePackages = "org.dromara.streamquery.stream.plugin.mybatisplus.*.pojo.po") +@EnableMybatisPlusPlugin( + basePackages = "org.dromara.streamquery.stream.plugin.mybatisplus.*.pojo.po") public class EnableMybatisPlusPluginByBasePackagesGeneralTest extends AbstractMybatisPlusTestApplication { diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesTest.java index a983db92..e25f6869 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/EnableMybatisPlusPluginByBasePackagesTest.java @@ -35,7 +35,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; * @author KamTo Hung */ @EnableAutoConfiguration -@EnableMybatisPlusPlugin(basePackages = "org.dromara.streamquery.stream.plugin.mybatisplus.annotation.pojo.po") +@EnableMybatisPlusPlugin( + basePackages = "org.dromara.streamquery.stream.plugin.mybatisplus.annotation.pojo.po") public class EnableMybatisPlusPluginByBasePackagesTest extends AbstractMybatisPlusTestApplication { @Test diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/RoleInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/RoleInfo.java index 94ec3168..1e6248dd 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/RoleInfo.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/RoleInfo.java @@ -16,14 +16,13 @@ */ package org.dromara.streamquery.stream.plugin.mybatisplus.annotation.pojo.po; -import lombok.Data; -import org.dromara.streamquery.stream.plugin.mybatisplus.engine.annotation.GenerateMapper; - import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.dromara.streamquery.stream.plugin.mybatisplus.engine.annotation.GenerateMapper; /** * RoleInfo diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserInfo.java index e4e9e2af..7740fda4 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserInfo.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserInfo.java @@ -16,15 +16,14 @@ */ package org.dromara.streamquery.stream.plugin.mybatisplus.annotation.pojo.po; -import java.time.LocalDateTime; - -import lombok.Data; -import org.dromara.streamquery.stream.plugin.mybatisplus.engine.mapper.IGenerateMapper; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.dromara.streamquery.stream.plugin.mybatisplus.engine.mapper.IGenerateMapper; + +import java.time.LocalDateTime; /** * UserInfo diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserRole.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserRole.java index 7a68d932..2549b2e3 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserRole.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/UserRole.java @@ -16,9 +16,8 @@ */ package org.dromara.streamquery.stream.plugin.mybatisplus.annotation.pojo.po; -import lombok.Data; - import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; /** * UserRole diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/inner/AddressInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/inner/AddressInfo.java index be30e109..789e08df 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/inner/AddressInfo.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/pojo/po/inner/AddressInfo.java @@ -16,11 +16,10 @@ */ package org.dromara.streamquery.stream.plugin.mybatisplus.annotation.pojo.po.inner; -import lombok.Data; -import org.dromara.streamquery.stream.plugin.mybatisplus.engine.annotation.GenerateMapper; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.dromara.streamquery.stream.plugin.mybatisplus.engine.annotation.GenerateMapper; /** * AddressInfo -- Gitee From bd09582299c6bedb4e40229fe64fa829da3c33f9 Mon Sep 17 00:00:00 2001 From: Cason <1125193113@qq.com> Date: Wed, 14 Jun 2023 19:33:18 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=EF=BC=8C=E8=A1=A5=E5=85=A8=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mybatisplus/QueryCondition.java | 30 +++++++------------ .../mybatisplus/QueryConditionTest.java | 11 +++++-- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java index 30e97133..92d07e69 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryCondition.java @@ -211,14 +211,11 @@ public class QueryCondition extends LambdaQueryWrapper { this.mapping = getMapping(column); return this.maybeDo( condition, - () -> { - this.appendSqlSegments( - this.columnToSqlSegment(column), - sqlKeyword, - () -> { - return this.formatParam(this.mapping, val); - }); - }); + () -> + this.appendSqlSegments( + this.columnToSqlSegment(column), + sqlKeyword, + () -> this.formatParam(this.mapping, val))); } private String getMapping(SFunction column) { @@ -237,18 +234,11 @@ public class QueryCondition extends LambdaQueryWrapper { @Override protected ISqlSegment inExpression(Collection value) { return CollectionUtils.isEmpty(value) - ? () -> { - return "()"; - } - : () -> { - return (String) - value.stream() - .map( - (i) -> { - return this.formatParam(this.mapping, i); - }) - .collect(Collectors.joining(",", "(", ")")); - }; + ? () -> "()" + : () -> + value.stream() + .map(i -> this.formatParam(this.mapping, i)) + .collect(Collectors.joining(",", "(", ")")); } @Override diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java index 8a8b62fa..f3a145df 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/QueryConditionTest.java @@ -171,8 +171,8 @@ public class QueryConditionTest { Database.saveFewSql(Lists.of(user1, user2, user3)); QueryCondition wrapper = - QueryCondition.query(UserInfoWithJsonName.class) - .activeIn(UserInfoWithJsonName::getName, Lists.of(name1, name3)); + QueryCondition.query(UserInfoWithJsonName.class) + .activeIn(UserInfoWithJsonName::getName, Lists.of(name1, name3)); val list = Database.list(wrapper); @@ -255,6 +255,13 @@ public class QueryConditionTest { .select(UserInfoWithJsonName::getName) .eq(UserInfoWithJsonName::getName, name); val list = Database.list(wrapper); + assertEquals(1, list.size(), "Query should return exactly one result"); + + UserInfoWithJsonName dbUser = list.get(0); + assertEquals( + user.getName().getUsername(), dbUser.getName().getUsername(), "Username should match"); + assertEquals( + user.getName().getNickname(), dbUser.getName().getNickname(), "Nickname should match"); } public static class JsonFieldHandler extends AbstractJsonFieldHandler { -- Gitee