From 83bfea17bc6348c4cb8d1e7e7036225ac50d1ec6 Mon Sep 17 00:00:00 2001 From: admin <570810310@qq.com> Date: Tue, 18 May 2021 15:20:36 +0800 Subject: [PATCH] https://gitee.com/best_handsome/mybatis-plus-join/issues/I3RS8S --- .../query/MPJLambdaQueryWrapper.java | 252 ------------------ .../yulichang/query/MPJQueryWrapper.java | 7 - .../github/yulichang/toolkit/LambdaUtils.java | 22 +- .../wrapper/MPJAbstractLambdaWrapper.java | 22 +- .../yulichang/wrapper/MPJLambdaWrapper.java | 10 +- 5 files changed, 23 insertions(+), 290 deletions(-) delete mode 100644 src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java diff --git a/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java deleted file mode 100644 index f706077..0000000 --- a/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.github.yulichang.query; - -import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper; -import com.baomidou.mybatisplus.core.conditions.SharedString; -import com.baomidou.mybatisplus.core.conditions.query.Query; -import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; -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.ArrayUtils; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.StringPool; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.yulichang.query.interfaces.MPJJoin; -import com.github.yulichang.toolkit.Constant; -import com.github.yulichang.toolkit.LambdaUtils; -import org.springframework.util.Assert; - -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * 不推荐使用这wrapper - * 这种既有string又有lambda对开发人员并不友好 - *

- * 推荐使用以下两个类 : - * String -> {@link MPJQueryWrapper} - * lambda -> {@link com.github.yulichang.wrapper.MPJLambdaWrapper} - *

- * - * @author yulichang - */ -@Deprecated -@SuppressWarnings("DeprecatedIsStillUsed") -public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper> - implements Query, T, SFunction>, MPJJoin> { - - /** - * 查询字段 - */ - private SharedString sqlSelect = new SharedString(); - - /** - * 连表字段 - */ - private SharedString from = SharedString.emptyString(); - - /** - * 主表别名 - */ - private final SharedString alias = new SharedString(Constant.TABLE_ALIAS); - - /** - * 查询的列 - */ - private List selectColumns = new ArrayList<>(); - - /** - * 排除的字段 - */ - private List ignoreColumns = new ArrayList<>(); - - /** - * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) - */ - public MPJLambdaQueryWrapper() { - super.initNeed(); - } - - /** - * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(...) - */ - MPJLambdaQueryWrapper(T entity, Class entityClass, SharedString from, SharedString sqlSelect, AtomicInteger paramNameSeq, - Map paramNameValuePairs, MergeSegments mergeSegments, - SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - List selectColumns, List ignoreColumns) { - super.setEntity(entity); - super.setEntityClass(entityClass); - this.paramNameSeq = paramNameSeq; - this.paramNameValuePairs = paramNameValuePairs; - this.expression = mergeSegments; - this.sqlSelect = sqlSelect; - this.from = from; - this.lastSql = lastSql; - this.sqlComment = sqlComment; - this.sqlFirst = sqlFirst; - this.selectColumns = selectColumns; - this.ignoreColumns = ignoreColumns; - } - - /** - * SELECT 部分 SQL 设置 - * - * @param columns 查询字段 - */ - @SafeVarargs - public final MPJLambdaQueryWrapper select(SFunction... columns) { - if (ArrayUtils.isNotEmpty(columns)) { - for (SFunction s : columns) { - selectColumns.add(columnToString(s, false)); - } - } - return typedThis; - } - - /** - * 忽略查询字段 - *

- * 用法: selectIgnore("t.id","t.sex","a.area") - * - * @since 1.1.3 - */ - public MPJLambdaQueryWrapper selectIgnore(String... columns) { - if (ArrayUtils.isNotEmpty(columns)) { - ignoreColumns.addAll(Arrays.asList(columns)); - } - return typedThis; - } - - /** - * 忽略查询字段 - *

- * 用法: selectIgnore("t.id","t.sex","a.area") - * - * @since 1.1.3 - */ - @SafeVarargs - public final MPJLambdaQueryWrapper selectIgnore(SFunction... columns) { - if (ArrayUtils.isNotEmpty(columns)) { - for (SFunction s : columns) { - ignoreColumns.add(Constant.TABLE_ALIAS + StringPool.DOT + LambdaUtils.getColumn(s)); - } - } - return typedThis; - } - - @Override - protected String columnToString(SFunction column, boolean onlyColumn) { - return Constant.TABLE_ALIAS + StringPool.DOT + super.columnToString(column, onlyColumn); - } - - public MPJLambdaQueryWrapper select(String... columns) { - if (ArrayUtils.isNotEmpty(columns)) { - Collections.addAll(selectColumns, columns); - } - return typedThis; - } - - /** - * 只针对主表 - *

- * 过滤查询的字段信息(主键除外!) - *

例1: 只要 java 字段名以 "test" 开头的 -> select(i -> i.getProperty().startsWith("test"))

- *

例2: 只要 java 字段属性是 CharSequence 类型的 -> select(TableFieldInfo::isCharSequence)

- *

例3: 只要 java 字段没有填充策略的 -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)

- *

例4: 要全部字段 -> select(i -> true)

- *

例5: 只要主键字段 -> select(i -> false)

- * - * @param predicate 过滤方式 - * @return this - */ - @Override - public MPJLambdaQueryWrapper select(Class entityClass, Predicate predicate) { - TableInfo info = TableInfoHelper.getTableInfo(entityClass); - Assert.notNull(info, "can not find table info"); - selectColumns.addAll(info.getFieldList().stream().filter(predicate).map(c -> - Constant.TABLE_ALIAS + StringPool.DOT + c.getColumn()).collect(Collectors.toList())); - return typedThis; - } - - - /** - * 查询主表全部字段 - * - * @param clazz 主表class - */ - public final MPJLambdaQueryWrapper selectAll(Class clazz) { - return selectAll(clazz, Constant.TABLE_ALIAS); - } - - /** - * 查询表全部字段 - * - * @param clazz 表实体 - * @param as 表别名 - */ - public final MPJLambdaQueryWrapper selectAll(Class clazz, String as) { - TableInfo info = TableInfoHelper.getTableInfo(clazz); - Assert.notNull(info, "can not find table info"); - if (info.havePK()) { - selectColumns.add(as + StringPool.DOT + info.getKeyColumn()); - } - selectColumns.addAll(info.getFieldList().stream().map(i -> - as + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); - return typedThis; - } - - /** - * 返回一个支持 lambda 函数写法的 wrapper - */ - public MPJQueryWrapper stringQuery() { - return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, - expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns); - } - - @Override - public String getSqlSelect() { - if (StringUtils.isBlank(sqlSelect.getStringValue())) { - if (CollectionUtils.isNotEmpty(ignoreColumns)) { - selectColumns.removeIf(ignoreColumns::contains); - } - sqlSelect.setStringValue(String.join(StringPool.COMMA, selectColumns)); - } - return sqlSelect.getStringValue(); - } - - public String getFrom() { - return from.getStringValue(); - } - - - public String getAlias() { - return alias.getStringValue(); - } - - /** - * 用于生成嵌套 sql - *

故 sqlSelect selectColumn ignoreColumns from不向下传递

- */ - @Override - protected MPJLambdaQueryWrapper instance() { - return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null); - } - - @Override - public void clear() { - super.clear(); - sqlSelect.toNull(); - } - - @Override - public MPJLambdaQueryWrapper join(String keyWord, boolean condition, String joinSql) { - if (condition) { - from.setStringValue(from.getStringValue() + keyWord + joinSql); - } - return typedThis; - } -} diff --git a/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java index 834d090..5bd34b5 100644 --- a/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java +++ b/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java @@ -172,13 +172,6 @@ public class MPJQueryWrapper extends AbstractWrapper lambda() { - return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs, - expression, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns); - } /** * 用于生成嵌套 sql diff --git a/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java b/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java index 2862d33..2039e71 100644 --- a/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java +++ b/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java @@ -1,12 +1,11 @@ package com.github.yulichang.toolkit; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; +import com.github.yulichang.exception.MPJException; import org.apache.ibatis.reflection.property.PropertyNamer; -import java.util.Objects; +import java.util.Map; /** * @author yulichang @@ -22,21 +21,6 @@ public final class LambdaUtils { return PropertyNamer.methodToProperty(com.baomidou.mybatisplus.core.toolkit.LambdaUtils.resolve(fn).getImplMethodName()); } - /** - * 获取列名 - */ - public static String getColumn(SFunction fn) { - SerializedLambda lambda = com.baomidou.mybatisplus.core.toolkit.LambdaUtils.resolve(fn); - String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); - try { - TableField annotation = lambda.getImplClass().getDeclaredField(fieldName).getAnnotation(TableField.class); - if (Objects.nonNull(annotation) && StringUtils.isNotBlank(annotation.value())) { - return annotation.value(); - } - } catch (NoSuchFieldException ignored) { - } - return StringUtils.camelToUnderline(fieldName); - } @SuppressWarnings("unchecked") public static Class getEntityClass(SFunction fn) { diff --git a/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java index 3748c83..37844d7 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java @@ -25,8 +25,10 @@ public abstract class MPJAbstractLambdaWrapper, Integer> subTable = new HashMap<>(); - private Map columnMap = null; - private boolean initColumnMap = false; + /** + * 缓存字段 + */ + protected Map, Map> columnMap = new HashMap<>(); @Override protected String columnToString(X column) { @@ -39,12 +41,18 @@ public abstract class MPJAbstractLambdaWrapper column, boolean onlyColumn) { - if (!initColumnMap) { - columnMap = com.baomidou.mybatisplus.core.toolkit.LambdaUtils.getColumnMap(LambdaUtils.getEntityClass(column)); - initColumnMap = true; - } return Constant.TABLE_ALIAS + getDefault(subTable.get(LambdaUtils.getEntityClass(column))) + StringPool.DOT + - columnMap.get(LambdaUtils.getName(column)).getColumn(); + getCache(column).getColumn(); + } + + protected ColumnCache getCache(SFunction fn) { + Class aClass = LambdaUtils.getEntityClass(fn); + Map cacheMap = columnMap.get(aClass); + if (cacheMap == null) { + cacheMap = com.baomidou.mybatisplus.core.toolkit.LambdaUtils.getColumnMap(aClass); + columnMap.put(aClass, cacheMap); + } + return cacheMap.get(com.baomidou.mybatisplus.core.toolkit.LambdaUtils.formatKey(LambdaUtils.getName(fn))); } protected String getDefault(Integer i) { diff --git a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index ca8ef15..6c11cf5 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -98,7 +98,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper select(SFunction... columns) { if (ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { - selectColumns.add(new SelectColumn(LambdaUtils.getEntityClass(s), LambdaUtils.getColumn(s), null)); + selectColumns.add(new SelectColumn(LambdaUtils.getEntityClass(s), getCache(s).getColumn(), null)); } } return typedThis; @@ -120,7 +120,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectAs(SFunction columns, String alias) { - selectColumns.add(new SelectColumn(LambdaUtils.getEntityClass(columns), LambdaUtils.getColumn(columns), alias)); + selectColumns.add(new SelectColumn(LambdaUtils.getEntityClass(columns), getCache(columns).getColumn(), alias)); return typedThis; } @@ -150,7 +150,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectIgnore(SFunction... columns) { if (ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { - ignoreColumns.add(new SelectColumn(LambdaUtils.getEntityClass(s), LambdaUtils.getColumn(s), null)); + ignoreColumns.add(new SelectColumn(LambdaUtils.getEntityClass(s), getCache(s).getColumn(), null)); } } return typedThis; @@ -210,11 +210,11 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper