diff --git a/pom.xml b/pom.xml index 40336d7..0d58016 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,10 @@ - 4.0.0 com.github.yulichang mybatis-plus-join - 1.2.4 + 1.2.5 mybatis-plus-join An enhanced toolkit of Mybatis-Plus to simplify development. https://github.com/yulichang/mybatis-plus-join diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJResultHelper.java b/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJResultHelper.java new file mode 100644 index 0000000..d02be92 --- /dev/null +++ b/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJResultHelper.java @@ -0,0 +1,65 @@ +package com.baomidou.mybatisplus.core.metadata; + +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * @Author Gy.13 + * @Description: 用于构建查询返回列,由于mybatis-plus条件构造的select无法实现通过传入VO实体类查询想要的列,需要一个一个指定 + * @Date: 2022/8/5 09:39 + */ +@SuppressWarnings("deprecation") +public class MPJResultHelper { + + + private static final Log logger = LogFactory.getLog(MPJResultHelper.class); + + + /** + * 储存反射VO信息 + */ + private static final Map, Set> VO_INFO_CACHE = new ConcurrentHashMap<>(); + + + /** + * @param sourceEntityClass + * @param resultEntityClass + * @Author Gy.13 + * @Description: 获取VO实体映射表信息 + * @return: java.util.Set + * @Date: 2022/8/5 09:59 + */ + public static Set getVoTableInfo(Class sourceEntityClass, Class resultEntityClass) { + if (resultEntityClass == null || ReflectionKit.isPrimitiveOrWrapper(resultEntityClass) || resultEntityClass == String.class || resultEntityClass.isInterface()) { + return null; + } + Set strings = VO_INFO_CACHE.get(resultEntityClass); + if (strings == null) { + Set set = new HashSet<>(); + MPJTableInfo info = MPJTableInfoHelper.getTableInfo(sourceEntityClass); + Assert.notNull(info, "table can not be find"); + List allFields = TableInfoHelper.getAllFields(resultEntityClass); + Assert.notNull(allFields, "table can not be find"); + Set fieldNames = allFields.stream().collect(Collectors.groupingBy(Field::getName)).keySet(); + info.getTableInfo().getFieldList().forEach( + i -> { + if (fieldNames.contains(i.getProperty())) { + set.add(i.getColumn()); + } + }); + /* 添加缓存 */ + VO_INFO_CACHE.put(resultEntityClass, set); + } + return VO_INFO_CACHE.get(resultEntityClass); + } +} diff --git a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index dc432c6..539415d 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -2,12 +2,12 @@ package com.github.yulichang.wrapper; import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.metadata.MPJResultHelper; 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.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.toolkit.Constant; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.MPJWrappers; @@ -18,10 +18,7 @@ import com.github.yulichang.wrapper.interfaces.on.OnFunction; import lombok.Data; import lombok.Getter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -39,46 +36,38 @@ import java.util.stream.Collectors; public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper> implements Query>, LambdaJoin> { - /** - * 查询字段 sql - */ - private SharedString sqlSelect = new SharedString(); - /** * 查询表 */ private final SharedString from = new SharedString(); - /** * 主表别名 */ private final SharedString alias = new SharedString(Constant.TABLE_ALIAS); - /** * 查询的字段 */ private final List selectColumns = new ArrayList<>(); - /** * 忽略查询的字段 */ private final List ignoreColumns = new ArrayList<>(); - - /** - * 是否 select distinct - */ - private boolean selectDistinct = false; - - /** - * 表序号 - */ - private int tableIndex = 1; - /** * ON sql wrapper集合 */ private final List> onWrappers = new ArrayList<>(); - + /** + * 查询字段 sql + */ + private SharedString sqlSelect = new SharedString(); + /** + * 是否 select distinct + */ + private boolean selectDistinct = false; + /** + * 表序号 + */ + private int tableIndex = 1; /** * 连表关键字 on 条件 func 使用 */ @@ -150,6 +139,15 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectAsClass(Class sourceEntityClass, Class resultEntityClass) { + TableInfo info = TableInfoHelper.getTableInfo(sourceEntityClass); + Assert.notNull(info, "table can not be find"); + Set voTableInfo = MPJResultHelper.getVoTableInfo(sourceEntityClass, resultEntityClass); + Assert.notNull(info, "table can not be find"); + voTableInfo.forEach(i -> selectColumns.add(SelectColumn.of(sourceEntityClass, i))); + return typedThis; + } + @Override public MPJLambdaWrapper selectAs(SFunction column, String alias) { selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias)); diff --git a/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java b/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java index ac70fdf..74ff529 100644 --- a/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java +++ b/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java @@ -15,6 +15,7 @@ public enum DefaultFuncEnum implements BaseFuncEnum { SUM("SUM(%s)"), COUNT("COUNT(%s)"), + COUNT_DISTINCT("COUNT(DISTINCT %s)"), MAX("MAX(%s)"), MIN("MIN(%s)"), AVG("AVG(%s)"), diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index 6557c10..d9bfa1a 100644 --- a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -190,6 +190,49 @@ public interface Query extends Serializable { return selectFunc(condition, DefaultFuncEnum.COUNT, column, alias); } + /** + * COUNT(DISTINCT) + */ + default Children selectCountDistinct(SFunction column) { + return selectFunc(DefaultFuncEnum.COUNT_DISTINCT, column); + } + + default Children selectCountDistinct(Object column, SFunction alias) { + return selectFunc(DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(Object column, String alias) { + return selectFunc(DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(SFunction column, SFunction alias) { + return selectFunc(DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(SFunction column, String alias) { + return selectFunc(DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(boolean condition, SFunction column) { + return selectFunc(condition, DefaultFuncEnum.COUNT_DISTINCT, column); + } + + default Children selectCountDistinct(boolean condition, Object column, SFunction alias) { + return selectFunc(condition, DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(boolean condition, Object column, String alias) { + return selectFunc(condition, DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(boolean condition, SFunction column, SFunction alias) { + return selectFunc(condition, DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + + default Children selectCountDistinct(boolean condition, SFunction column, String alias) { + return selectFunc(condition, DefaultFuncEnum.COUNT_DISTINCT, column, alias); + } + /** * MAX() */