From 567cae431a0dafa38acbb6b1cf2ae57935e1d760 Mon Sep 17 00:00:00 2001 From: admin <570810310@qq.com> Date: Thu, 4 Feb 2021 18:51:40 +0800 Subject: [PATCH] update --- README.md | 88 +++++++++-------- pom.xml | 2 +- .../yulichang/MybatisPlusConfiguration.java | 11 +-- .../interceptor/MyJoinInterceptor.java | 55 +++++++++++ .../interceptor/MyResultInterceptor.java | 73 -------------- .../yulichang/query/MyLambdaQueryWrapper.java | 4 +- .../yulichang/query/MyQueryWrapper.java | 4 +- .../yulichang/toolkit/MyLambdaUtils.java | 30 +++++- .../wrapper/MyAbstractLambdaWrapper.java | 99 ++----------------- .../wrapper/MyJoinLambdaQueryWrapper.java | 69 ++++++------- 10 files changed, 186 insertions(+), 249 deletions(-) create mode 100644 src/main/java/com/github/yulichang/interceptor/MyJoinInterceptor.java delete mode 100644 src/main/java/com/github/yulichang/interceptor/MyResultInterceptor.java diff --git a/README.md b/README.md index 51754ea..8ec7653 100644 --- a/README.md +++ b/README.md @@ -8,31 +8,38 @@ ### 方法一 -1. 将代码down到本地,使用maven install - -2. 在自己的项目中添加依赖 +1. 在项目中添加依赖,依赖已经包含了mybatis-plus3.4.2,依赖后无需再次引入mybatis-plus ```xml com.github.yulichang mybatis-plus-join - 1.0.0-SNAPSHOT + 1.0.5 ``` -### 方法二 +2. 配置插件,添加MyJoinInterceptor -1. 将mybatisplus目录复制到你的工程中的springboot扫描路径下 +```java -2. 添加cglib依赖 +@Configuration +public class MybatisPlusConfig { - ```xml - - cglib - cglib - 3.3.0 - - ``` + /** + * 启用连表拦截器 + */ + @Bean + public MybatisPlusInterceptor paginationInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + //分页插件 + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + //连表插件 + mybatisPlusInterceptor.addInnerInterceptor(new MyJoinInterceptor()); + //可以添加多租户或其他插件 + return mybatisPlusInterceptor; + } +} +``` ### 使用 @@ -40,12 +47,12 @@ * service继承MyBaseService (可选) * serviceImpl继承MyBaseServiceImpl (可选) -1. MyBaseMapper继承BaseMapper,在原有的方法基础上又添加了以下方法: - * selectJoinOne 连表查询一条记录对象 - * selectJoinList 连表查询返回命中记录对象集合 - * selectJoinPage 连表分页查询对象集合 - * selectJoinMap 连表查询一条记录返回Map - * selectJoinMaps 连表查询返回命中记录Map集合 +1. MyBaseMapper继承BaseMapper,在原有的方法基础上又添加了以下方法: + * selectJoinOne 连表查询一条记录对象 + * selectJoinList 连表查询返回命中记录对象集合 + * selectJoinPage 连表分页查询对象集合 + * selectJoinMap 连表查询一条记录返回Map + * selectJoinMaps 连表查询返回命中记录Map集合 * selectJoinMapsPage 连表分页查询返回Map集合 2. MyBaseService 继承了IService,同样添加以上方法 @@ -189,34 +196,33 @@ class test { 对应sql ```mysql -SELECT - t.id, - t.name, - t.sex, - t.head_img, - addr.tel, - addr.address, - CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex, - sum(a.province) as province -FROM - user t - LEFT JOIN (select * from user_address) addr on t.id = addr.user_id - RIGHT JOIN area a on addr.area_id = a.id -WHERE - t.id = ? - AND addr.tel LIKE ? - AND a.province <= ?) -ORDER BY - addr.id DESC +SELECT t.id, + t.name, + t.sex, + t.head_img, + addr.tel, + addr.address, + CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex, + sum(a.province) as province +FROM user t + LEFT JOIN (select * from user_address) addr on t.id = addr.user_id + RIGHT JOIN area a on addr.area_id = a.id +WHERE t.id = ? + AND addr.tel LIKE ? + AND a.province <= ?) +ORDER BY + addr.id +DESC ``` ## MyJoinLambdaQueryWrapper用法 -MyJoinLambdaQueryWrapper与MyLambdaQueryWrapper不同,是一套新的支持多表的wrapper +MyJoinLambdaQueryWrapper与上面连个Wrapper不同,是一套新的支持多表的wrapper +MyQueryWrapper是基于QueryWrapper扩展的 MyLambdaQueryWrapper是基于LambdaQueryWrapper扩展的 而LambdaQueryWrapper由于泛型约束,不支持扩展成多表的lambdaWrapper -#### MyJoinLambdaQueryWrapper更符合面向对象(OOP),没有魔术值,全部基于lambda,但灵活性不如上面的 +#### MyJoinLambdaQueryWrapper示例 #### 简单的3表查询 diff --git a/pom.xml b/pom.xml index 3eee00a..eaebc59 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.github.yulichang mybatis-plus-join - 1.0.2 + 1.0.5 mp An enhanced toolkit of Mybatis-Plus to simplify development. https://github.com/yulichang/mybatis-plus-join diff --git a/src/main/java/com/github/yulichang/MybatisPlusConfiguration.java b/src/main/java/com/github/yulichang/MybatisPlusConfiguration.java index d79abb6..8d39a36 100644 --- a/src/main/java/com/github/yulichang/MybatisPlusConfiguration.java +++ b/src/main/java/com/github/yulichang/MybatisPlusConfiguration.java @@ -1,7 +1,6 @@ package com.github.yulichang; import com.github.yulichang.injector.MySqlInjector; -import com.github.yulichang.interceptor.MyResultInterceptor; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -18,9 +17,9 @@ public class MybatisPlusConfiguration { return new MySqlInjector(); } - @Bean - @ConditionalOnMissingBean(MyResultInterceptor.class) - public MyResultInterceptor myResultInterceptor() { - return new MyResultInterceptor(); - } +// @Bean +// @ConditionalOnMissingBean(MyResultInterceptor.class) +// public MyResultInterceptor myResultInterceptor() { +// return new MyResultInterceptor(); +// } } diff --git a/src/main/java/com/github/yulichang/interceptor/MyJoinInterceptor.java b/src/main/java/com/github/yulichang/interceptor/MyJoinInterceptor.java new file mode 100644 index 0000000..39f1cd6 --- /dev/null +++ b/src/main/java/com/github/yulichang/interceptor/MyJoinInterceptor.java @@ -0,0 +1,55 @@ +package com.github.yulichang.interceptor; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.github.yulichang.toolkit.Constant; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.ResultMap; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.lang.reflect.Field; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +/** + * 结果封装拦截器 + * + * @author yulichang + */ +public class MyJoinInterceptor implements InnerInterceptor { + + private static Field type = null; + + static { + try { + type = ResultMap.class.getDeclaredField("type"); + type.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + @Override + @SuppressWarnings("unchecked") + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { + if (parameter instanceof Map) { + Map map = (Map) parameter; + if (CollectionUtils.isNotEmpty(map)) { + try { + Class clazz = (Class) map.get(Constant.CLAZZ); + List list = ms.getResultMaps(); + if (CollectionUtils.isNotEmpty(list)) { + ResultMap resultMap = list.get(0); + type.set(resultMap, clazz); + } + } catch (Exception ignored) { + //通常是MapperMethod内部类HashMap的子类ParamMap重写了了get方法抛出的BindingException + } + } + } + } +} diff --git a/src/main/java/com/github/yulichang/interceptor/MyResultInterceptor.java b/src/main/java/com/github/yulichang/interceptor/MyResultInterceptor.java deleted file mode 100644 index d60c201..0000000 --- a/src/main/java/com/github/yulichang/interceptor/MyResultInterceptor.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.github.yulichang.interceptor; - -import com.baomidou.mybatisplus.core.MybatisParameterHandler; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.github.yulichang.toolkit.Constant; -import org.apache.ibatis.executor.statement.StatementHandler; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.ResultMap; -import org.apache.ibatis.plugin.*; - -import java.lang.reflect.Field; -import java.sql.Connection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * 结果封装 - * - * @author yulichang - */ -@Intercepts({ - @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}), -}) -//@SuppressWarnings("all") -public class MyResultInterceptor implements Interceptor { - - /** - * 缓存初始化反射字段 - * todo - * 应该可以想mybatis-plus那样用自定义的MybatisParameterHandler直接获取mappedStatement和resultMap,而不是反射获取 - */ - private static Field mappedStatement = null; - private static Field type = null; - - static { - try { - mappedStatement = MybatisParameterHandler.class.getDeclaredField("mappedStatement"); - mappedStatement.setAccessible(true); - type = ResultMap.class.getDeclaredField("type"); - type.setAccessible(true); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } - } - - @Override - public Object intercept(Invocation invocation) throws Throwable { - if (Objects.nonNull(invocation.getTarget()) && invocation.getTarget() instanceof MybatisParameterHandler) { - MybatisParameterHandler mybatisParameterHandler = (MybatisParameterHandler) invocation.getTarget(); - Map map = (Map) mybatisParameterHandler.getParameterObject(); - if (CollectionUtils.isNotEmpty(map)) { - try { - Class resClazz = (Class) map.get(Constant.CLAZZ); - MappedStatement statement = (MappedStatement) mappedStatement.get(mybatisParameterHandler); - List list = statement.getResultMaps(); - if (CollectionUtils.isNotEmpty(list)) { - ResultMap resultMap = list.get(0); - type.set(resultMap, resClazz); - } - } catch (Exception e) { - return invocation.proceed(); - } - } - } - return invocation.proceed(); - } - - @Override - public Object plugin(Object target) { - return Plugin.wrap(target, this); - } -} diff --git a/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java index 378fdf0..0c270ae 100644 --- a/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java @@ -153,7 +153,9 @@ public class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper selectAll(Class clazz) { TableInfo info = TableInfoHelper.getTableInfo(clazz); List list = new ArrayList<>(); - list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); + if (info.havePK()) { + list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); + } list.addAll(info.getFieldList().stream().map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); String join = String.join(StringPool.COMMA, list); if (StringUtils.isBlank(sqlSelect.getStringValue())) { diff --git a/src/main/java/com/github/yulichang/query/MyQueryWrapper.java b/src/main/java/com/github/yulichang/query/MyQueryWrapper.java index 40d551d..7b357bc 100644 --- a/src/main/java/com/github/yulichang/query/MyQueryWrapper.java +++ b/src/main/java/com/github/yulichang/query/MyQueryWrapper.java @@ -97,7 +97,9 @@ public class MyQueryWrapper extends AbstractWrapper selectAll(Class clazz) { TableInfo info = TableInfoHelper.getTableInfo(clazz); List list = new ArrayList<>(); - list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); + if (info.havePK()) { + list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); + } list.addAll(info.getFieldList().stream().map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); String join = String.join(StringPool.COMMA, list); if (StringUtils.isBlank(sqlSelect.getStringValue())) { diff --git a/src/main/java/com/github/yulichang/toolkit/MyLambdaUtils.java b/src/main/java/com/github/yulichang/toolkit/MyLambdaUtils.java index c3c3455..a43bcce 100644 --- a/src/main/java/com/github/yulichang/toolkit/MyLambdaUtils.java +++ b/src/main/java/com/github/yulichang/toolkit/MyLambdaUtils.java @@ -1,29 +1,51 @@ package com.github.yulichang.toolkit; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; import org.apache.ibatis.reflection.property.PropertyNamer; +import java.lang.reflect.Field; +import java.util.Objects; + /** * @author yulichang * @see LambdaUtils * @see PropertyNamer */ -@SuppressWarnings("all") + public final class MyLambdaUtils { - + /** + * 获取lambda属性名 UserDO::getId -> id + */ public static String getName(SFunction fn) { return PropertyNamer.methodToProperty(LambdaUtils.resolve(fn).getImplMethodName()); } + /** + * 获取列明 + * 优先获取tableField中的值 + */ public static String getColumn(SFunction fn) { - return StringUtils.camelToUnderline(getName(fn)); + + SerializedLambda lambda = LambdaUtils.resolve(fn); + String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); + try { + Field field = lambda.getImplClass().getDeclaredField(fieldName); + TableField annotation = field.getAnnotation(TableField.class); + if (Objects.nonNull(annotation)) { + return annotation.value(); + } + } catch (NoSuchFieldException ignored) { + } + return StringUtils.camelToUnderline(fieldName); } + @SuppressWarnings("unchecked") public static Class getEntityClass(SFunction fn) { return (Class) LambdaUtils.resolve(fn).getInstantiatedType(); } - } diff --git a/src/main/java/com/github/yulichang/wrapper/MyAbstractLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MyAbstractLambdaWrapper.java index 7903b86..a863e38 100644 --- a/src/main/java/com/github/yulichang/wrapper/MyAbstractLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MyAbstractLambdaWrapper.java @@ -1,15 +1,10 @@ package com.github.yulichang.wrapper; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; -import com.baomidou.mybatisplus.core.toolkit.Assert; -import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; 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.toolkit.Constant; import com.github.yulichang.toolkit.MyLambdaUtils; -import org.apache.ibatis.reflection.property.PropertyNamer; import java.util.Arrays; import java.util.HashMap; @@ -29,9 +24,9 @@ public abstract class MyAbstractLambdaWrapper + * 关联的表 */ - protected Map, SubClass> subTable = new HashMap<>(); + protected final Map, Integer> subTable = new HashMap<>(); @SuppressWarnings("unchecked") protected String columnsToString(SFunction... columns) { @@ -54,89 +49,15 @@ public abstract class MyAbstractLambdaWrapper column, boolean onlyColumn) { - TableInfo info = TableInfoHelper.getTableInfo(MyLambdaUtils.getEntityClass(column)); - Assert.notNull(info, "can not find table for lambda"); - return info.getTableName() + StringPool.DOT + getColumn(LambdaUtils.resolve(column), onlyColumn); + return Constant.TABLE_ALIAS + getDefault(subTable.get(MyLambdaUtils.getEntityClass(column))) + StringPool.DOT + + MyLambdaUtils.getColumn(column); } - - /** - * 获取 SerializedLambda 对应的列信息,从 lambda 表达式中推测实体类 - *

- * 如果获取不到列信息,那么本次条件组装将会失败 - * - * @param lambda lambda 表达式 - * @param onlyColumn 如果是,结果: "name", 如果否: "name" as "name" - * @return 列 - * @throws com.baomidou.mybatisplus.core.exceptions.MybatisPlusException 获取不到列信息时抛出异常 - * @see SerializedLambda#getImplClass() - * @see SerializedLambda#getImplMethodName() - */ - private String getColumn(SerializedLambda lambda, boolean onlyColumn) { - Class aClass = lambda.getInstantiatedType(); - tryInitCache(aClass); - String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); - ColumnCache columnCache = getColumnCache(fieldName, aClass); - return onlyColumn ? columnCache.getColumn() : columnCache.getColumnSelect(); + protected String getDefault(Integer i) { + if (Objects.nonNull(i)) { + return i.toString(); + } + return StringPool.SPACE; } - private void tryInitCache(Class lambdaClass) { - if (!initColumnMap) { - final Class entityClass = getEntityClass(); - if (entityClass != null) { - lambdaClass = entityClass; - } - columnMap = LambdaUtils.getColumnMap(lambdaClass); - initColumnMap = true; - } - Assert.notNull(columnMap, "can not find lambda cache for this entity [%s]", lambdaClass.getName()); - } - - private ColumnCache getColumnCache(String fieldName, Class lambdaClass) { - ColumnCache columnCache = columnMap.get(LambdaUtils.formatKey(fieldName)); - if (Objects.isNull(columnCache)) { - columnCache = new ColumnCache(fieldName, null); - } - return columnCache; - } - - public static class SubClass { - - private String tableAlias; - - private SFunction left; - - private SFunction right; - - - public SubClass(String tableAlias, SFunction left, SFunction right) { - this.tableAlias = tableAlias; - this.left = left; - this.right = right; - } - - public String getTableAlias() { - return tableAlias; - } - - public void setTableAlias(String tableAlias) { - this.tableAlias = tableAlias; - } - - public SFunction getLeft() { - return left; - } - - public void setLeft(SFunction left) { - this.left = left; - } - - public SFunction getRight() { - return right; - } - - public void setRight(SFunction right) { - this.right = right; - } - } } diff --git a/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java index db6f3e0..6325410 100644 --- a/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java @@ -15,9 +15,7 @@ import com.github.yulichang.toolkit.MyLambdaUtils; import com.github.yulichang.wrapper.interfaces.MyLambdaJoin; import com.github.yulichang.wrapper.interfaces.MySFunctionQuery; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -42,13 +40,17 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper selectColumns = new ArrayList<>(); + /** + * 表序号 + */ + private int tableIndex = 1; /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) @@ -99,9 +101,7 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper MyJoinLambdaQueryWrapper select(SFunction... columns) { if (ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { - Class clazz = MyLambdaUtils.getEntityClass(s); - TableInfo info = TableInfoHelper.getTableInfo(clazz); - selectColumns.add(new SelectColumn(clazz, info.getTableName(), MyLambdaUtils.getColumn(s), null)); + selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(s), MyLambdaUtils.getColumn(s), null)); } } return typedThis; @@ -112,25 +112,24 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper selectColumns.add(new SelectColumn(entityClass, info.getTableName(), i.getColumn(), null))); + i -> selectColumns.add(new SelectColumn(entityClass, i.getColumn(), null))); return typedThis; } public final MyJoinLambdaQueryWrapper selectAs(SFunction columns, SFunction alias) { - Class clazz = MyLambdaUtils.getEntityClass(columns); - TableInfo info = TableInfoHelper.getTableInfo(clazz); - Assert.notNull(info, "table can not be find for lambda"); - selectColumns.add(new SelectColumn(clazz, info.getTableName(), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias))); + selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(columns), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias))); return typedThis; } public final MyJoinLambdaQueryWrapper selectAll(Class clazz) { TableInfo info = TableInfoHelper.getTableInfo(clazz); Assert.notNull(info, "table can not be find -> %s", clazz); - selectColumns.add(new SelectColumn(clazz, info.getTableName(), info.getKeyColumn(), null)); + if (info.havePK()) { + selectColumns.add(new SelectColumn(clazz, info.getKeyColumn(), null)); + } info.getFieldList().forEach(c -> - selectColumns.add(new SelectColumn(clazz, info.getTableName(), c.getColumn(), null))); + selectColumns.add(new SelectColumn(clazz, c.getColumn(), null))); return typedThis; } @@ -138,7 +137,7 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper - i.getTableName() + StringPool.DOT + i.getColumnName() + + Constant.TABLE_ALIAS + getDefault(subTable.get(i.getClazz())) + StringPool.DOT + i.getColumnName() + (StringUtils.isBlank(i.getAlias()) ? StringPool.EMPTY : (Constant.AS + i.getAlias()))) .collect(Collectors.joining(StringPool.COMMA)); sqlSelect.setStringValue(s); @@ -174,22 +173,37 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper MyJoinLambdaQueryWrapper join(String keyWord, boolean condition, Class clazz, SFunction left, SFunction right) { if (condition) { + subTable.put(clazz, tableIndex); TableInfo leftInfo = TableInfoHelper.getTableInfo(clazz); - TableInfo rightInfo = TableInfoHelper.getTableInfo(MyLambdaUtils.getEntityClass(right)); - String s = keyWord + leftInfo.getTableName() + Constant.ON + leftInfo.getTableName() + StringPool.DOT - + MyLambdaUtils.getColumn(left) + Constant.EQUALS + rightInfo.getTableName() + StringPool.DOT - + MyLambdaUtils.getColumn(right); + StringBuilder sb = new StringBuilder(keyWord) + .append(leftInfo.getTableName()) + .append(StringPool.SPACE) + .append(Constant.TABLE_ALIAS) + .append(tableIndex) + .append(StringPool.SPACE) + .append(Constant.ON) + .append(Constant.TABLE_ALIAS) + .append(tableIndex) + .append(StringPool.DOT) + .append(MyLambdaUtils.getColumn(left)) + .append(Constant.EQUALS) + .append(Constant.TABLE_ALIAS) + .append(getDefault(subTable.get(MyLambdaUtils.getEntityClass(right)))) + .append(StringPool.DOT) + .append(MyLambdaUtils.getColumn(right)); + tableIndex++; if (StringUtils.isBlank(from.getStringValue())) { - from.setStringValue(s); + from.setStringValue(sb.toString()); } else { - from.setStringValue(from.getStringValue() + s); + from.setStringValue(from.getStringValue() + sb.toString()); } } return typedThis; } + /** * select字段 */ @@ -197,15 +211,12 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper clazz; - private String tableName; - private String columnName; private String alias; - public SelectColumn(Class clazz, String tableName, String columnName, String alias) { + public SelectColumn(Class clazz, String columnName, String alias) { this.clazz = clazz; - this.tableName = tableName; this.columnName = columnName; this.alias = alias; } @@ -218,14 +229,6 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper