mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
升级MP依赖3.5.3.2 & 同步新版功能及代码
This commit is contained in:
parent
a8b91edb6b
commit
9340e5e38f
@ -46,7 +46,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-extension</artifactId>
|
<artifactId>mybatis-plus-extension</artifactId>
|
||||||
<version>3.5.3.1</version>
|
<version>3.5.3.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
<version>3.5.3.1</version>
|
<version>3.5.3.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -67,13 +67,13 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-extension</artifactId>
|
<artifactId>mybatis-plus-extension</artifactId>
|
||||||
<version>3.5.3.1</version>
|
<version>3.5.3.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>1.18.24</version>
|
<version>1.18.28</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -85,7 +85,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jetbrains.kotlin</groupId>
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||||
<version>1.8.21</version>
|
<version>1.9.0</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.github.yulichang.kt;
|
package com.github.yulichang.kt;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.*;
|
import com.baomidou.mybatisplus.core.toolkit.*;
|
||||||
import com.github.yulichang.config.ConfigProperties;
|
import com.github.yulichang.config.ConfigProperties;
|
||||||
@ -11,6 +12,7 @@ import com.github.yulichang.toolkit.KtUtils;
|
|||||||
import com.github.yulichang.toolkit.KtWrapperUtils;
|
import com.github.yulichang.toolkit.KtWrapperUtils;
|
||||||
import com.github.yulichang.toolkit.TableList;
|
import com.github.yulichang.toolkit.TableList;
|
||||||
import com.github.yulichang.toolkit.support.ColumnCache;
|
import com.github.yulichang.toolkit.support.ColumnCache;
|
||||||
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
import com.github.yulichang.wrapper.interfaces.Chain;
|
import com.github.yulichang.wrapper.interfaces.Chain;
|
||||||
import com.github.yulichang.wrapper.interfaces.SelectWrapper;
|
import com.github.yulichang.wrapper.interfaces.SelectWrapper;
|
||||||
import com.github.yulichang.wrapper.resultmap.Label;
|
import com.github.yulichang.wrapper.resultmap.Label;
|
||||||
@ -58,6 +60,17 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
*/
|
*/
|
||||||
private SharedString unionSql;
|
private SharedString unionSql;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义wrapper索引
|
||||||
|
*/
|
||||||
|
private AtomicInteger wrapperIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义wrapper
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private Map<String, Wrapper<?>> wrapperMap;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 推荐使用 带 class 的构造方法
|
* 推荐使用 带 class 的构造方法
|
||||||
@ -192,6 +205,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
/**
|
/**
|
||||||
* 子查询
|
* 子查询
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("DuplicatedCode")
|
||||||
public KtLambdaWrapper<T> selectSub(Class<?> clazz, String st, Consumer<KtLambdaWrapper<?>> consumer, KProperty<?> alias) {
|
public KtLambdaWrapper<T> selectSub(Class<?> clazz, String st, Consumer<KtLambdaWrapper<?>> consumer, KProperty<?> alias) {
|
||||||
KtLambdaWrapper<?> wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
|
KtLambdaWrapper<?> wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
|
||||||
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
|
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
|
||||||
@ -203,6 +217,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
wrapper.alias = st;
|
wrapper.alias = st;
|
||||||
wrapper.subTableAlias = st;
|
wrapper.subTableAlias = st;
|
||||||
consumer.accept(wrapper);
|
consumer.accept(wrapper);
|
||||||
|
addCustomWrapper(wrapper);
|
||||||
String sql = KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName());
|
String sql = KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName());
|
||||||
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
|
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
|
||||||
return typedThis;
|
return typedThis;
|
||||||
@ -215,6 +230,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
public final KtLambdaWrapper<T> union(KtLambdaWrapper<?>... wrappers) {
|
public final KtLambdaWrapper<T> union(KtLambdaWrapper<?>... wrappers) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (KtLambdaWrapper<?> wrapper : wrappers) {
|
for (KtLambdaWrapper<?> wrapper : wrappers) {
|
||||||
|
addCustomWrapper(wrapper);
|
||||||
Class<?> entityClass = wrapper.getEntityClass();
|
Class<?> entityClass = wrapper.getEntityClass();
|
||||||
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
||||||
sb.append(" UNION ")
|
sb.append(" UNION ")
|
||||||
@ -234,6 +250,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
public final <E, F> KtLambdaWrapper<T> unionAll(KtLambdaWrapper<T>... wrappers) {
|
public final <E, F> KtLambdaWrapper<T> unionAll(KtLambdaWrapper<T>... wrappers) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (KtLambdaWrapper<?> wrapper : wrappers) {
|
for (KtLambdaWrapper<?> wrapper : wrappers) {
|
||||||
|
addCustomWrapper(wrapper);
|
||||||
Class<?> entityClass = wrapper.getEntityClass();
|
Class<?> entityClass = wrapper.getEntityClass();
|
||||||
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
||||||
sb.append(" UNION ALL ")
|
sb.append(" UNION ALL ")
|
||||||
@ -246,6 +263,20 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("DuplicatedCode")
|
||||||
|
private void addCustomWrapper(KtLambdaWrapper<?> wrapper) {
|
||||||
|
if (Objects.isNull(wrapperIndex)) {
|
||||||
|
wrapperIndex = new AtomicInteger(0);
|
||||||
|
}
|
||||||
|
int index = wrapperIndex.incrementAndGet();
|
||||||
|
if (Objects.isNull(wrapperMap)) {
|
||||||
|
wrapperMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
String key = "ew" + index;
|
||||||
|
wrapper.setParamAlias(wrapper.getParamAlias() + ".wrapperMap." + key);
|
||||||
|
wrapperMap.put(key, wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询条件 SQL 片段
|
* 查询条件 SQL 片段
|
||||||
*/
|
*/
|
||||||
@ -329,6 +360,8 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
selectDistinct = false;
|
selectDistinct = false;
|
||||||
sqlSelect.toNull();
|
sqlSelect.toNull();
|
||||||
selectColumns.clear();
|
selectColumns.clear();
|
||||||
|
wrapperIndex = new AtomicInteger(0);
|
||||||
|
wrapperMap.clear();
|
||||||
resultMapMybatisLabel.clear();
|
resultMapMybatisLabel.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,16 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
|
|||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPJLambdaQueryWrapper<T> select(boolean condition, List<SFunction<T, ?>> columns) {
|
||||||
|
if (condition && CollectionUtils.isNotEmpty(columns)) {
|
||||||
|
for (SFunction<T, ?> s : columns) {
|
||||||
|
selectColumns.add(columnToString(s, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return typedThis;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 忽略查询字段
|
* 忽略查询字段
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -4,14 +4,17 @@ import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.Query;
|
import com.baomidou.mybatisplus.core.conditions.query.Query;
|
||||||
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
||||||
|
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
|
||||||
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
|
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
|
||||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.*;
|
import com.baomidou.mybatisplus.core.toolkit.*;
|
||||||
import com.github.yulichang.config.ConfigProperties;
|
import com.github.yulichang.config.ConfigProperties;
|
||||||
import com.github.yulichang.query.interfaces.StringJoin;
|
import com.github.yulichang.query.interfaces.StringJoin;
|
||||||
import com.github.yulichang.toolkit.Asserts;
|
import com.github.yulichang.toolkit.Asserts;
|
||||||
|
import com.github.yulichang.toolkit.MPJSqlInjectionUtils;
|
||||||
import com.github.yulichang.toolkit.TableHelper;
|
import com.github.yulichang.toolkit.TableHelper;
|
||||||
import com.github.yulichang.wrapper.interfaces.Chain;
|
import com.github.yulichang.wrapper.interfaces.Chain;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
@ -48,6 +51,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
|||||||
/**
|
/**
|
||||||
* 主表别名
|
* 主表别名
|
||||||
*/
|
*/
|
||||||
|
@Getter
|
||||||
private String alias = ConfigProperties.tableAlias;
|
private String alias = ConfigProperties.tableAlias;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,6 +78,11 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
|||||||
*/
|
*/
|
||||||
private Function<String, String> tableNameFunc;
|
private Function<String, String> tableNameFunc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查 SQL 注入过滤
|
||||||
|
*/
|
||||||
|
private boolean checkSqlInjection = false;
|
||||||
|
|
||||||
|
|
||||||
public MPJQueryWrapper() {
|
public MPJQueryWrapper() {
|
||||||
super.initNeed();
|
super.initNeed();
|
||||||
@ -114,6 +123,22 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
|||||||
this.selectDistinct = selectDistinct;
|
this.selectDistinct = selectDistinct;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开启检查 SQL 注入
|
||||||
|
*/
|
||||||
|
public MPJQueryWrapper<T> checkSqlInjection() {
|
||||||
|
this.checkSqlInjection = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String columnToString(String column) {
|
||||||
|
if (checkSqlInjection && MPJSqlInjectionUtils.check(column)) {
|
||||||
|
throw new MybatisPlusException("Discovering SQL injection column: " + column);
|
||||||
|
}
|
||||||
|
return column;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sql去重
|
* sql去重
|
||||||
* select distinct
|
* select distinct
|
||||||
@ -131,6 +156,14 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
|||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPJQueryWrapper<T> select(boolean condition, List<String> columns) {
|
||||||
|
if (condition && CollectionUtils.isNotEmpty(columns)) {
|
||||||
|
selectColumns.addAll(columns);
|
||||||
|
}
|
||||||
|
return typedThis;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 忽略查询字段
|
* 忽略查询字段
|
||||||
* <p>
|
* <p>
|
||||||
@ -208,10 +241,6 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
|||||||
return from.getStringValue();
|
return from.getStringValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAlias() {
|
|
||||||
return alias;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置主表别名
|
* 设置主表别名
|
||||||
* 如果要用,请最先调用,
|
* 如果要用,请最先调用,
|
||||||
|
@ -69,7 +69,7 @@ public class DeleteJoinWrapper<T> extends MPJAbstractLambdaWrapper<T, DeleteJoin
|
|||||||
* 获取删除的表
|
* 获取删除的表
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("UnusedReturnValue")
|
@SuppressWarnings({"UnusedReturnValue", "DuplicatedCode"})
|
||||||
public String getDeleteSql() {
|
public String getDeleteSql() {
|
||||||
if (StringUtils.isNotBlank(this.deleteSql.getStringValue())) {
|
if (StringUtils.isNotBlank(this.deleteSql.getStringValue())) {
|
||||||
return this.deleteSql.getStringValue();
|
return this.deleteSql.getStringValue();
|
||||||
|
@ -36,13 +36,14 @@ import static java.util.stream.Collectors.joining;
|
|||||||
*
|
*
|
||||||
* @author yulichang
|
* @author yulichang
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"DuplicatedCode", "unused"})
|
@SuppressWarnings({"DuplicatedCode", "unused", "LombokGetterMayBeUsed"})
|
||||||
public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLambdaWrapper<T, Children>>
|
public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLambdaWrapper<T, Children>>
|
||||||
extends MPJAbstractWrapper<T, Children> implements QueryJoin<Children, T> {
|
extends MPJAbstractWrapper<T, Children> implements QueryJoin<Children, T> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主表别名
|
* 主表别名
|
||||||
*/
|
*/
|
||||||
|
@Getter
|
||||||
protected String alias = ConfigProperties.tableAlias;
|
protected String alias = ConfigProperties.tableAlias;
|
||||||
/**
|
/**
|
||||||
* 副表别名
|
* 副表别名
|
||||||
@ -365,10 +366,6 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
|
|||||||
return from.getStringValue();
|
return from.getStringValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAlias() {
|
|
||||||
return alias;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 内部调用, 不建议使用
|
* 内部调用, 不建议使用
|
||||||
*/
|
*/
|
||||||
@ -462,6 +459,7 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
|
|||||||
this.hasAlias = false;
|
this.hasAlias = false;
|
||||||
this.keyWord = null;
|
this.keyWord = null;
|
||||||
this.logicSql = true;
|
this.logicSql = true;
|
||||||
|
this.checkSqlInjection = false;
|
||||||
this.onWrappers.clear();
|
this.onWrappers.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.github.yulichang.wrapper;
|
package com.github.yulichang.wrapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
import com.baomidou.mybatisplus.core.conditions.SharedString;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.*;
|
import com.baomidou.mybatisplus.core.toolkit.*;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||||
@ -57,6 +58,17 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
*/
|
*/
|
||||||
private SharedString unionSql;
|
private SharedString unionSql;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义wrapper索引
|
||||||
|
*/
|
||||||
|
private AtomicInteger wrapperIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义wrapper
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private Map<String, Wrapper<?>> wrapperMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 推荐使用 带 class 的构造方法
|
* 推荐使用 带 class 的构造方法
|
||||||
*/
|
*/
|
||||||
@ -192,6 +204,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
/**
|
/**
|
||||||
* 子查询
|
* 子查询
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("DuplicatedCode")
|
||||||
public <E, F> MPJLambdaWrapper<T> selectSub(Class<E> clazz, String st, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {
|
public <E, F> MPJLambdaWrapper<T> selectSub(Class<E> clazz, String st, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {
|
||||||
MPJLambdaWrapper<E> wrapper = new MPJLambdaWrapper<E>(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
|
MPJLambdaWrapper<E> wrapper = new MPJLambdaWrapper<E>(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
|
||||||
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
|
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
|
||||||
@ -203,6 +216,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
wrapper.alias = st;
|
wrapper.alias = st;
|
||||||
wrapper.subTableAlias = st;
|
wrapper.subTableAlias = st;
|
||||||
consumer.accept(wrapper);
|
consumer.accept(wrapper);
|
||||||
|
addCustomWrapper(wrapper);
|
||||||
String sql = WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias));
|
String sql = WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias));
|
||||||
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
|
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
|
||||||
return typedThis;
|
return typedThis;
|
||||||
@ -215,6 +229,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
public final MPJLambdaWrapper<T> union(MPJLambdaWrapper<?>... wrappers) {
|
public final MPJLambdaWrapper<T> union(MPJLambdaWrapper<?>... wrappers) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (MPJLambdaWrapper<?> wrapper : wrappers) {
|
for (MPJLambdaWrapper<?> wrapper : wrappers) {
|
||||||
|
addCustomWrapper(wrapper);
|
||||||
Class<?> entityClass = wrapper.getEntityClass();
|
Class<?> entityClass = wrapper.getEntityClass();
|
||||||
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
||||||
sb.append(" UNION ")
|
sb.append(" UNION ")
|
||||||
@ -234,6 +249,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
public final <E, F> MPJLambdaWrapper<T> unionAll(MPJLambdaWrapper<T>... wrappers) {
|
public final <E, F> MPJLambdaWrapper<T> unionAll(MPJLambdaWrapper<T>... wrappers) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (MPJLambdaWrapper<?> wrapper : wrappers) {
|
for (MPJLambdaWrapper<?> wrapper : wrappers) {
|
||||||
|
addCustomWrapper(wrapper);
|
||||||
Class<?> entityClass = wrapper.getEntityClass();
|
Class<?> entityClass = wrapper.getEntityClass();
|
||||||
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
|
||||||
sb.append(" UNION ALL ")
|
sb.append(" UNION ALL ")
|
||||||
@ -246,6 +262,20 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("DuplicatedCode")
|
||||||
|
private void addCustomWrapper(MPJLambdaWrapper<?> wrapper) {
|
||||||
|
if (Objects.isNull(wrapperIndex)) {
|
||||||
|
wrapperIndex = new AtomicInteger(0);
|
||||||
|
}
|
||||||
|
int index = wrapperIndex.incrementAndGet();
|
||||||
|
if (Objects.isNull(wrapperMap)) {
|
||||||
|
wrapperMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
String key = "ew" + index;
|
||||||
|
wrapper.setParamAlias(wrapper.getParamAlias() + ".wrapperMap." + key);
|
||||||
|
wrapperMap.put(key, wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询条件 SQL 片段
|
* 查询条件 SQL 片段
|
||||||
*/
|
*/
|
||||||
@ -329,6 +359,8 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
|
|||||||
selectDistinct = false;
|
selectDistinct = false;
|
||||||
sqlSelect.toNull();
|
sqlSelect.toNull();
|
||||||
selectColumns.clear();
|
selectColumns.clear();
|
||||||
|
wrapperIndex = new AtomicInteger(0);
|
||||||
|
wrapperMap.clear();
|
||||||
resultMapMybatisLabel.clear();
|
resultMapMybatisLabel.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package com.github.yulichang.wrapper.interfaces;
|
package com.github.yulichang.wrapper.interfaces;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.github.yulichang.wrapper.segments.Select;
|
import com.github.yulichang.wrapper.segments.Select;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author yulichang
|
* @author yulichang
|
||||||
@ -21,4 +23,6 @@ public interface SelectWrapper<Entity, Children> {
|
|||||||
boolean isResultMap();
|
boolean isResultMap();
|
||||||
|
|
||||||
List<?> getResultMapMybatisLabel();
|
List<?> getResultMapMybatisLabel();
|
||||||
|
|
||||||
|
Map<String, Wrapper<?>> getWrapperMap();
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-extension</artifactId>
|
<artifactId>mybatis-plus-extension</artifactId>
|
||||||
<version>3.5.3.1</version>
|
<version>3.5.3.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -1057,21 +1057,38 @@ class LambdaWrapperTest {
|
|||||||
wrapper1.list();
|
wrapper1.list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* select 子查询
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void checkOrderBy() {
|
||||||
|
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
|
||||||
|
.selectAll(UserDO.class)
|
||||||
|
.leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)
|
||||||
|
.le(UserDO::getId, 100)
|
||||||
|
.checkSqlInjection()
|
||||||
|
.orderByDesc("t.id");
|
||||||
|
wrapper.list();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* select 子查询
|
* select 子查询
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
void union() {
|
void union() {
|
||||||
|
ThreadLocalUtils.set();
|
||||||
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
|
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
|
||||||
.selectAll(UserDO.class);
|
.selectAll(UserDO.class)
|
||||||
|
.eq(UserDO::getId, 1);
|
||||||
MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class)
|
MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class)
|
||||||
.selectAll(UserDO.class);
|
.selectAll(UserDO.class)
|
||||||
|
.eq(UserDO::getName, "张三 2");
|
||||||
MPJLambdaWrapper<UserDO> wrapper2 = JoinWrappers.lambda(UserDO.class)
|
MPJLambdaWrapper<UserDO> wrapper2 = JoinWrappers.lambda(UserDO.class)
|
||||||
.selectAll(UserDO.class);
|
.selectAll(UserDO.class)
|
||||||
|
.eq(UserDO::getPid, 2);
|
||||||
wrapper.union(wrapper1, wrapper2);
|
wrapper.union(wrapper1, wrapper2);
|
||||||
wrapper.list();
|
List<UserDO> list = wrapper.list();
|
||||||
System.out.println(1);
|
|
||||||
|
assert list.size() == 7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1128,16 +1128,18 @@ class LambdaWrapperTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
fun union() {
|
fun union() {
|
||||||
ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false")
|
|
||||||
val wrapper: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
|
val wrapper: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
|
||||||
.selectAll(UserDO::class.java)
|
.selectAll(UserDO::class.java)
|
||||||
|
.eq(UserDO::id, 1)
|
||||||
val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
|
val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
|
||||||
.selectAll(UserDO::class.java)
|
.selectAll(UserDO::class.java)
|
||||||
|
.eq(UserDO::name, "张三 2")
|
||||||
val wrapper2: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
|
val wrapper2: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
|
||||||
.selectAll(UserDO::class.java)
|
.selectAll(UserDO::class.java)
|
||||||
|
.eq(UserDO::pid, 2)
|
||||||
|
|
||||||
wrapper.union(wrapper1, wrapper2)
|
wrapper.union(wrapper1, wrapper2)
|
||||||
wrapper.list()
|
val list = wrapper.list()
|
||||||
println(1)
|
assert(list.size == 7)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
<version>3.5.3.1</version>
|
<version>3.5.3.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user