From 722821e0f013eedba839ad85d320d1b8bebcae88 Mon Sep 17 00:00:00 2001 From: admin <570810310@qq.com> Date: Fri, 28 May 2021 17:22:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9E=E8=A1=A8=E6=9F=A5=E8=AF=A2ON=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E6=94=AF=E6=8C=81=E5=A4=9A=E6=9D=A1=E4=BB=B6,?= =?UTF-8?q?=E4=BB=A5=E5=8F=8Awhere=E6=94=AF=E6=8C=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=8E=E5=AD=97=E6=AE=B5=E7=9A=84=E6=9D=A1=E4=BB=B6(a.id=20?= =?UTF-8?q?=3D=20b.a=5Fid)=E8=BF=99=E6=A0=B7=E7=9A=84=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/wrapper/MPJAbstractWrapper.java | 74 ++++++++- .../yulichang/wrapper/MPJLambdaWrapper.java | 91 +++++------ .../wrapper/interfaces/LambdaJoin.java | 33 +++- .../wrapper/interfaces/on/OnCompare.java | 151 ++++++++++++++++++ .../wrapper/interfaces/on/OnFunction.java | 9 ++ 5 files changed, 306 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java create mode 100644 src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java diff --git a/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index d6f207f..84a8e42 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -15,6 +15,7 @@ import com.github.yulichang.toolkit.sql.SqlScriptUtils; import com.github.yulichang.wrapper.interfaces.Compare; import com.github.yulichang.wrapper.interfaces.Func; import com.github.yulichang.wrapper.interfaces.Join; +import com.github.yulichang.wrapper.interfaces.on.OnCompare; import java.util.Arrays; import java.util.Collection; @@ -34,9 +35,9 @@ import static java.util.stream.Collectors.joining; * * @author yulichang */ -@SuppressWarnings({"serial", "unchecked"}) +@SuppressWarnings("ALL") public abstract class MPJAbstractWrapper> extends Wrapper - implements Compare, Nested, Join, Func { + implements Compare, Nested, Join, Func, OnCompare { /** * 占位符 @@ -383,6 +384,11 @@ public abstract class MPJAbstractWrapper formatParam(null, val))); } + protected Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, SFunction val) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), sqlKeyword, + columnToSqlSegment(val))); + } + /** * 多重嵌套查询条件 * @@ -596,4 +602,68 @@ public abstract class MPJAbstractWrapper Children eq(boolean condition, SFunction column, SFunction val) { + return addCondition(condition, column, EQ, val); + } + + @Override + public Children ne(boolean condition, SFunction column, SFunction val) { + return addCondition(condition, column, NE, val); + } + + @Override + public Children gt(boolean condition, SFunction column, SFunction val) { + return addCondition(condition, column, GT, val); + } + + @Override + public Children ge(boolean condition, SFunction column, SFunction val) { + return addCondition(condition, column, GE, val); + } + + @Override + public Children lt(boolean condition, SFunction column, SFunction val) { + return addCondition(condition, column, LT, val); + } + + @Override + public Children le(boolean condition, SFunction column, SFunction val) { + return addCondition(condition, column, LE, val); + } + + @Override + public Children between(boolean condition, SFunction column, SFunction val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN, + columnToSqlSegment(val1), AND, columnToSqlSegment(val2))); + } + + public Children between(boolean condition, SFunction column, Object val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN, + () -> formatParam(null, val1), AND, columnToSqlSegment(val2))); + } + + public Children between(boolean condition, SFunction column, SFunction val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN, + columnToSqlSegment(val1), AND, () -> formatParam(null, val2))); + } + + @Override + public Children notBetween(boolean condition, SFunction column, SFunction val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN, + columnToSqlSegment(val1), AND, columnToSqlSegment(val2))); + } + + public Children notBetween(boolean condition, SFunction column, Object val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN, + () -> formatParam(null, val1), AND, columnToSqlSegment(val2))); + } + + public Children notBetween(boolean condition, SFunction column, SFunction val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN, + columnToSqlSegment(val1), AND, () -> formatParam(null, val2))); + } } diff --git a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 301b9f0..8f96cca 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -8,9 +8,11 @@ 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.toolkit.Constant; -import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.wrapper.interfaces.LambdaJoin; import com.github.yulichang.wrapper.interfaces.SFunctionQuery; +import com.github.yulichang.wrapper.interfaces.on.OnFunction; +import lombok.Data; +import lombok.Getter; import java.util.ArrayList; import java.util.List; @@ -63,6 +65,23 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper> onWrappers = new ArrayList<>(); + + /** + * 连表关键字 on 条件 func 使用 + */ + @Getter + private String keyWord; + + /** + * 连表实体类 on 条件 func 使用 + */ + @Getter + private Class joinClass; + /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery() */ @@ -70,13 +89,14 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - Map, Integer> subTable) { + Map, Integer> subTable, String keyWord, Class joinClass) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -87,6 +107,8 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper wrapper : onWrappers) { + String tableName = TableInfoHelper.getTableInfo(wrapper.getJoinClass()).getTableName(); + value.append(wrapper.getKeyWord()) + .append(tableName) + .append(Constant.SPACE_TABLE_ALIAS) + .append(subTable.get(wrapper.getJoinClass())) + .append(Constant.ON) + .append(wrapper.getExpression().getNormal().getSqlSegment()); + } + from.setStringValue(value.toString()); + } return from.getStringValue(); } @@ -187,9 +222,13 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper instance() { + return instance(null, null); + } + + protected MPJLambdaWrapper instance(String keyWord, Class joinClass) { return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - this.subTable); + this.subTable, keyWord, joinClass); } @Override @@ -199,28 +238,13 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper join(String keyWord, boolean condition, Class clazz, SFunction left, SFunction right) { + public MPJLambdaWrapper join(String keyWord, boolean condition, Class clazz, OnFunction function) { if (condition) { + MPJLambdaWrapper apply = function.apply(instance(keyWord, clazz)); + onWrappers.add(apply); subTable.put(clazz, tableIndex); TableInfo leftInfo = TableInfoHelper.getTableInfo(clazz); - StringBuilder sb = new StringBuilder(keyWord) - .append(leftInfo.getTableName()) - .append(Constant.SPACE_TABLE_ALIAS) - .append(tableIndex) - .append(Constant.ON_TABLE_ALIAS) - .append(tableIndex) - .append(StringPool.DOT) - .append(getCache(left).getColumn()) - .append(Constant.EQUALS_TABLE_ALIAS) - .append(getDefault(subTable.get(LambdaUtils.getEntityClass(right)))) - .append(StringPool.DOT) - .append(getCache(right).getColumn()); tableIndex++; - if (StringUtils.isBlank(from.getStringValue())) { - from.setStringValue(sb.toString()); - } else { - from.setStringValue(from.getStringValue() + sb.toString()); - } } return typedThis; } @@ -228,6 +252,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper clazz; @@ -241,29 +266,5 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper getClazz() { - return clazz; - } - - public void setClazz(Class clazz) { - this.clazz = clazz; - } - - public String getColumnName() { - return columnName; - } - - public void setColumnName(String columnName) { - this.columnName = columnName; - } - - public String getAlias() { - return alias; - } - - public void setAlias(String alias) { - this.alias = alias; - } } } diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/LambdaJoin.java b/src/main/java/com/github/yulichang/wrapper/interfaces/LambdaJoin.java index b6c4ed3..2b278c7 100644 --- a/src/main/java/com/github/yulichang/wrapper/interfaces/LambdaJoin.java +++ b/src/main/java/com/github/yulichang/wrapper/interfaces/LambdaJoin.java @@ -3,6 +3,7 @@ package com.github.yulichang.wrapper.interfaces; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.toolkit.Constant; +import com.github.yulichang.wrapper.interfaces.on.OnFunction; /** * @author yulichang @@ -13,27 +14,49 @@ public interface LambdaJoin extends MPJBaseJoin { return leftJoin(true, clazz, left, right); } + default Children leftJoin(Class clazz, OnFunction function) { + return leftJoin(true, clazz, function); + } + default Children leftJoin(boolean condition, Class clazz, SFunction left, SFunction right) { - return join(Constant.LEFT_JOIN, condition, clazz, left, right); + return leftJoin(condition, clazz, on -> on.eq(left, right)); + } + + default Children leftJoin(boolean condition, Class clazz, OnFunction function) { + return join(Constant.LEFT_JOIN, condition, clazz, function); } default Children rightJoin(Class clazz, SFunction left, SFunction right) { return rightJoin(true, clazz, left, right); } + default Children rightJoin(Class clazz, OnFunction function) { + return rightJoin(true, clazz, function); + } + default Children rightJoin(boolean condition, Class clazz, SFunction left, SFunction right) { - return join(Constant.RIGHT_JOIN, condition, clazz, left, right); + return rightJoin(condition, clazz, on -> on.eq(left, right)); + } + + default Children rightJoin(boolean condition, Class clazz, OnFunction function) { + return join(Constant.RIGHT_JOIN, condition, clazz, function); } default Children innerJoin(Class clazz, SFunction left, SFunction right) { return innerJoin(true, clazz, left, right); } - default Children innerJoin(boolean condition, Class clazz, SFunction left, SFunction right) { - return join(Constant.INNER_JOIN, condition, clazz, left, right); + default Children innerJoin(Class clazz, OnFunction function) { + return innerJoin(true, clazz, function); } - Children join(String keyWord, boolean condition, Class clazz, SFunction left, SFunction right); + default Children innerJoin(boolean condition, Class clazz, SFunction left, SFunction right) { + return innerJoin(condition, clazz, on -> on.eq(left, right)); + } + default Children innerJoin(boolean condition, Class clazz, OnFunction function) { + return join(Constant.INNER_JOIN, condition, clazz, function); + } + Children join(String keyWord, boolean condition, Class clazz, OnFunction function); } diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java b/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java new file mode 100644 index 0000000..8d07b6d --- /dev/null +++ b/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java @@ -0,0 +1,151 @@ +package com.github.yulichang.wrapper.interfaces.on; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +import java.io.Serializable; + +/** + * 将原来的泛型R改成SFunction, Object改为SFunction + * 以及移除不会在ON语句中出现的条件 比如like相关 保留原来的like 只是不太可能会出现 on a.id like b.id 所以不会支持这种写法 + *

+ * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + */ +public interface OnCompare extends Serializable { + /** + * ignore + */ + default Children eq(SFunction column, SFunction val) { + return eq(true, column, val); + } + + /** + * 等于 = + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children eq(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children ne(SFunction column, SFunction val) { + return ne(true, column, val); + } + + /** + * 不等于 <> + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children ne(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children gt(SFunction column, SFunction val) { + return gt(true, column, val); + } + + /** + * 大于 > + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children gt(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children ge(SFunction column, SFunction val) { + return ge(true, column, val); + } + + /** + * 大于等于 >= + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children ge(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children lt(SFunction column, SFunction val) { + return lt(true, column, val); + } + + /** + * 小于 < + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children lt(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children le(SFunction column, SFunction val) { + return le(true, column, val); + } + + /** + * 小于等于 <= + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children le(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children between(SFunction column, SFunction val1, SFunction val2) { + return between(true, column, val1, val2); + } + + /** + * BETWEEN 值1 AND 值2 + * + * @param condition 执行条件 + * @param column 字段 + * @param val1 值1 + * @param val2 值2 + * @return children + */ + Children between(boolean condition, SFunction column, SFunction val1, SFunction val2); + + /** + * ignore + */ + default Children notBetween(SFunction column, SFunction val1, SFunction val2) { + return notBetween(true, column, val1, val2); + } + + /** + * NOT BETWEEN 值1 AND 值2 + * + * @param condition 执行条件 + * @param column 字段 + * @param val1 值1 + * @param val2 值2 + * @return children + */ + Children notBetween(boolean condition, SFunction column, SFunction val1, SFunction val2); +} diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java b/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java new file mode 100644 index 0000000..6b7d18c --- /dev/null +++ b/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnFunction.java @@ -0,0 +1,9 @@ +package com.github.yulichang.wrapper.interfaces.on; + +import com.github.yulichang.wrapper.MPJLambdaWrapper; + +@FunctionalInterface +public interface OnFunction { + + MPJLambdaWrapper apply(MPJLambdaWrapper wrapper); +}