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