From 14a7af8f895a429a3ed4e77c57520d204cad6d20 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Thu, 8 Jun 2023 15:50:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20field=20query=20=E5=83=8F=20join=20quer?= =?UTF-8?q?y=20=E4=B8=80=E6=A0=B7=E6=94=AF=E6=8C=81=E9=9B=86=E5=90=88?= =?UTF-8?q?=E5=AD=90=E7=B1=BB=E5=9E=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/util/ClassUtil.java | 4 ++++ .../com/mybatisflex/core/util/MapperUtil.java | 23 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java index a6c0f90a..a4151175 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java @@ -105,6 +105,10 @@ public class ClassUtil { || clazz == double[].class; } + public static boolean canInstance(int mod) { + return !Modifier.isAbstract(mod) || !Modifier.isInterface(mod); + } + public static T newInstance(Class clazz) { try { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java index d08ab41d..96292d0e 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java @@ -30,6 +30,10 @@ import java.util.function.Consumer; public class MapperUtil { + private MapperUtil() { + } + + public static void queryFields(BaseMapper mapper, List list, Consumer>[] consumers) { if (CollectionUtil.isEmpty(list) || ArrayUtil.isEmpty(consumers) || consumers[0] == null) { return; @@ -47,11 +51,18 @@ public class MapperUtil { Class mappingType = fieldWrapper.getMappingType(); Object value; - if (fieldType.isAssignableFrom(List.class)) { + if (Set.class.isAssignableFrom(fieldType)) { value = mapper.selectListByQueryAs(childQuery, mappingType); - } else if (fieldType.isAssignableFrom(Set.class)) { + if (ClassUtil.canInstance(fieldType.getModifiers())) { + value = copyValue(fieldType, value); + } else { + value = new HashSet<>((Collection) value); + } + } else if (Collection.class.isAssignableFrom(fieldType)) { value = mapper.selectListByQueryAs(childQuery, mappingType); - value = new HashSet<>((Collection) value); + if (ClassUtil.canInstance(fieldType.getModifiers())) { + value = copyValue(fieldType, value); + } } else if (fieldType.isArray()) { value = mapper.selectListByQueryAs(childQuery, mappingType); value = ((List) value).toArray(); @@ -63,6 +74,12 @@ public class MapperUtil { }); } + @SuppressWarnings({"unchecked", "rawtypes"}) + private static Object copyValue(Class fieldType, Object value) { + Collection collection = (Collection) ClassUtil.newInstance(fieldType); + collection.addAll((Collection) value); + return collection; + } /**