24282 1 жил өмнө
parent
commit
9a914185ef

+ 195 - 0
my-test/src/main/java/org/example/join/domain/AbstractQueryColumn.java

@@ -0,0 +1,195 @@
+package org.example.join.domain;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import org.apache.ibatis.reflection.property.PropertyNamer;
+import org.example.join.util.SqlConstant;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+
+public abstract class AbstractQueryColumn implements IFormat, IQueryColumn {
+
+    /**
+     * 计算列表
+     */
+    protected final List<QueryColumnCompute> queryColumnComputeList = new ArrayList<>();
+
+    public <T> QueryColumnAlias as(SFunction<T, ?> function) {
+        LambdaMeta meta = LambdaUtils.extract(function);
+        String alias = StrUtil.toUnderlineCase(PropertyNamer.methodToProperty(meta.getImplMethodName()));
+        return new QueryColumnAlias(alias, this);
+    }
+
+    // ===========================================
+    // 运算 加 减 乘 除 取余 + - * / %
+    // ===========================================
+
+    public AbstractQueryColumn add(AbstractQueryColumn queryColumn) {
+        return compute(SqlConstant.ADD, queryColumn);
+    }
+
+    public AbstractQueryColumn add(Number number) {
+        return compute(SqlConstant.ADD, number);
+    }
+
+    public AbstractQueryColumn subtract(AbstractQueryColumn queryColumn) {
+        return compute(SqlConstant.SUBTRACT, queryColumn);
+    }
+
+    public AbstractQueryColumn subtract(Number number) {
+        return compute(SqlConstant.SUBTRACT, number);
+    }
+
+    public AbstractQueryColumn multiply(AbstractQueryColumn queryColumn) {
+        return compute(SqlConstant.MULTIPLY, queryColumn);
+    }
+
+    public AbstractQueryColumn multiply(Number number) {
+        return compute(SqlConstant.MULTIPLY, number);
+    }
+
+    public AbstractQueryColumn divide(AbstractQueryColumn queryColumn) {
+        return compute(SqlConstant.DIVIDE, queryColumn);
+    }
+
+    public AbstractQueryColumn divide(Number number) {
+        return compute(SqlConstant.DIVIDE, number);
+    }
+
+    public AbstractQueryColumn remainder(AbstractQueryColumn queryColumn) {
+        return compute(SqlConstant.REMAINDER, queryColumn);
+    }
+
+    public AbstractQueryColumn remainder(Number number) {
+        return compute(SqlConstant.REMAINDER, number);
+    }
+
+    public QueryConditionOrder asc() {
+        return new QueryConditionOrder(this, SqlConstant.ASC);
+    }
+
+    public QueryConditionOrder desc() {
+        return new QueryConditionOrder(this, SqlConstant.DESC);
+    }
+
+    public QueryCondition eq(Object object) {
+        return new QueryCondition(this, SqlConstant.EQ, object);
+    }
+
+    public QueryCondition ne(Object object) {
+        return new QueryCondition(this, SqlConstant.NE, object);
+    }
+
+    public QueryCondition gt(Object object) {
+        return new QueryCondition(this, SqlConstant.GT, object);
+    }
+
+    public QueryCondition lt(Object object) {
+        return new QueryCondition(this, SqlConstant.LT, object);
+    }
+
+    public QueryCondition ge(Object object) {
+        return new QueryCondition(this, SqlConstant.GE, object);
+    }
+
+    public QueryCondition le(Object object) {
+        return new QueryCondition(this, SqlConstant.LE, object);
+    }
+
+    public QueryCondition between(Object object1, Object object2) {
+        if (ObjectUtil.isAllNotEmpty(object1, object2)) {
+            return new QueryCondition(this, SqlConstant.BETWEEN, new Object[]{object1, object2});
+        }
+        return new QueryCondition(this, SqlConstant.BETWEEN, null);
+    }
+
+    public QueryCondition notBetween(Object object1, Object object2) {
+        if (ObjectUtil.isAllNotEmpty(object1, object2)) {
+            return new QueryCondition(this, SqlConstant.NOT_BETWEEN, new Object[]{object1, object2});
+        }
+        return new QueryCondition(this, SqlConstant.NOT_BETWEEN, null);
+    }
+
+    public QueryCondition like(Object object) {
+        return new QueryCondition(this, SqlConstant.LIKE, object);
+    }
+
+    public QueryCondition notLike(Object object) {
+        return new QueryCondition(this, SqlConstant.NOT_LIKE, object);
+    }
+
+    public QueryCondition likeLeft(Object object) {
+        return new QueryCondition(this, SqlConstant.LIKE_LEFT, object);
+    }
+
+    public QueryCondition notLikeLeft(Object object) {
+        return new QueryCondition(this, SqlConstant.NOT_LIKE_LEFT, object);
+    }
+
+    public QueryCondition likeRight(Object object) {
+        return new QueryCondition(this, SqlConstant.LIKE_RIGHT, object);
+    }
+
+    public QueryCondition notLikeRight(Object object) {
+        return new QueryCondition(this, SqlConstant.NOT_LIKE_RIGHT, object);
+    }
+
+    public QueryCondition isNull() {
+        return new QueryCondition(this, SqlConstant.IS_NULL, SqlConstant.IS_NULL);
+    }
+
+    public QueryCondition isNotNull() {
+        return new QueryCondition(this, SqlConstant.IS_NOT_NULL, SqlConstant.IS_NULL);
+    }
+
+    public QueryCondition in(Collection<?> coll) {
+        return new QueryCondition(this, SqlConstant.IN, coll);
+    }
+
+    public QueryCondition in(Object... obj) {
+        if (ObjectUtil.isEmpty(obj)) {
+            return new QueryCondition(this, SqlConstant.IN, null);
+        }
+        return new QueryCondition(this, SqlConstant.IN, Arrays.asList(obj));
+    }
+
+    public QueryCondition notIn(Collection<?> coll) {
+        return new QueryCondition(this, SqlConstant.NOT_IN, coll);
+    }
+
+    public QueryCondition notIn(Object... obj) {
+        if (ObjectUtil.isEmpty(obj)) {
+            return new QueryCondition(this, SqlConstant.NOT_IN, null);
+        }
+        return new QueryCondition(this, SqlConstant.NOT_IN, Arrays.asList(obj));
+    }
+
+    private AbstractQueryColumn compute(String symbol, Object obj) {
+        AbstractQueryColumn newQueryColumn = copy();
+        newQueryColumn.queryColumnComputeList.add(new QueryColumnCompute(symbol, obj));
+        return newQueryColumn;
+    }
+
+    protected String spliceCompute(String sql, Map<String, String> tableAliasMap, Map<String, Object> paramMap) {
+        if (ObjectUtil.isEmpty(queryColumnComputeList)) {
+            return sql;
+        }
+
+        StringJoiner joiner = new StringJoiner(StringPool.EMPTY, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET);
+        joiner.add(sql);
+        queryColumnComputeList.forEach(item -> joiner.add(item.toSql(tableAliasMap, paramMap)));
+        return joiner.toString();
+    }
+
+    protected abstract AbstractQueryColumn copy();
+
+}

+ 8 - 198
my-test/src/main/java/org/example/join/domain/QueryColumn.java

@@ -1,24 +1,11 @@
 package org.example.join.domain;
 
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta;
-import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import org.apache.ibatis.reflection.property.PropertyNamer;
-import org.example.join.util.SqlConstant;
 import org.example.join.util.SqlUtil;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
 import java.util.Map;
-import java.util.StringJoiner;
-import java.util.stream.Collectors;
 
-public class QueryColumn implements IFormat, IQueryColumn {
+public class QueryColumn extends AbstractQueryColumn implements IFormat, IQueryColumn {
 
     /**
      * 表
@@ -30,199 +17,22 @@ public class QueryColumn implements IFormat, IQueryColumn {
      */
     private final String name;
 
-    /**
-     * 计算列表
-     */
-    private final List<QueryColumnCompute> queryColumnComputeList;
-
     public QueryColumn(Table table, String name) {
         this.table = table;
         this.name = name;
-        this.queryColumnComputeList = new ArrayList<>();
-    }
-
-    protected QueryColumn(Table table, String name, List<QueryColumnCompute> queryColumnComputeList) {
-        this.table = table;
-        this.name = name;
-        this.queryColumnComputeList = queryColumnComputeList;
-    }
-
-    public <T> QueryColumnAlias as(SFunction<T, ?> function) {
-        LambdaMeta meta = LambdaUtils.extract(function);
-        String alias = StrUtil.toUnderlineCase(PropertyNamer.methodToProperty(meta.getImplMethodName()));
-        return new QueryColumnAlias(alias, this);
-    }
-
-    // ===========================================
-    // 运算 加 减 乘 除 取余 + - * / %
-    // ===========================================
-
-    public QueryColumn add(QueryColumn queryColumn) {
-        return compute(SqlConstant.ADD, queryColumn);
-    }
-
-    public QueryColumn add(Number number) {
-        return compute(SqlConstant.ADD, number);
-    }
-
-    public QueryColumn subtract(QueryColumn queryColumn) {
-        return compute(SqlConstant.SUBTRACT, queryColumn);
-    }
-
-    public QueryColumn subtract(Number number) {
-        return compute(SqlConstant.SUBTRACT, number);
-    }
-
-    public QueryColumn multiply(QueryColumn queryColumn) {
-        return compute(SqlConstant.MULTIPLY, queryColumn);
-    }
-
-    public QueryColumn multiply(Number number) {
-        return compute(SqlConstant.MULTIPLY, number);
-    }
-
-    public QueryColumn divide(QueryColumn queryColumn) {
-        return compute(SqlConstant.DIVIDE, queryColumn);
-    }
-
-    public QueryColumn divide(Number number) {
-        return compute(SqlConstant.DIVIDE, number);
-    }
-
-    public QueryColumn remainder(QueryColumn queryColumn) {
-        return compute(SqlConstant.REMAINDER, queryColumn);
-    }
-
-    public QueryColumn remainder(Number number) {
-        return compute(SqlConstant.REMAINDER, number);
-    }
-
-    public QueryConditionOrder asc() {
-        return new QueryConditionOrder(this, SqlConstant.ASC);
-    }
-
-    public QueryConditionOrder desc() {
-        return new QueryConditionOrder(this, SqlConstant.DESC);
-    }
-
-    public QueryCondition eq(Object object) {
-        return new QueryCondition(this, SqlConstant.EQ, object);
-    }
-
-    public QueryCondition ne(Object object) {
-        return new QueryCondition(this, SqlConstant.NE, object);
-    }
-
-    public QueryCondition gt(Object object) {
-        return new QueryCondition(this, SqlConstant.GT, object);
     }
 
-    public QueryCondition lt(Object object) {
-        return new QueryCondition(this, SqlConstant.LT, object);
-    }
-
-    public QueryCondition ge(Object object) {
-        return new QueryCondition(this, SqlConstant.GE, object);
-    }
-
-    public QueryCondition le(Object object) {
-        return new QueryCondition(this, SqlConstant.LE, object);
-    }
-
-    public QueryCondition between(Object object1, Object object2) {
-        if (ObjectUtil.isAllNotEmpty(object1, object2)) {
-            return new QueryCondition(this, SqlConstant.BETWEEN, new Object[]{object1, object2});
-        }
-        return new QueryCondition(this, SqlConstant.BETWEEN, null);
-    }
-
-    public QueryCondition notBetween(Object object1, Object object2) {
-        if (ObjectUtil.isAllNotEmpty(object1, object2)) {
-            return new QueryCondition(this, SqlConstant.NOT_BETWEEN, new Object[]{object1, object2});
-        }
-        return new QueryCondition(this, SqlConstant.NOT_BETWEEN, null);
-    }
-
-    public QueryCondition like(Object object) {
-        return new QueryCondition(this, SqlConstant.LIKE, object);
-    }
-
-    public QueryCondition notLike(Object object) {
-        return new QueryCondition(this, SqlConstant.NOT_LIKE, object);
-    }
-
-    public QueryCondition likeLeft(Object object) {
-        return new QueryCondition(this, SqlConstant.LIKE_LEFT, object);
-    }
-
-    public QueryCondition notLikeLeft(Object object) {
-        return new QueryCondition(this, SqlConstant.NOT_LIKE_LEFT, object);
-    }
-
-    public QueryCondition likeRight(Object object) {
-        return new QueryCondition(this, SqlConstant.LIKE_RIGHT, object);
-    }
-
-    public QueryCondition notLikeRight(Object object) {
-        return new QueryCondition(this, SqlConstant.NOT_LIKE_RIGHT, object);
-    }
-
-    public QueryCondition isNull() {
-        return new QueryCondition(this, SqlConstant.IS_NULL, SqlConstant.IS_NULL);
-    }
-
-    public QueryCondition isNotNull() {
-        return new QueryCondition(this, SqlConstant.IS_NOT_NULL, SqlConstant.IS_NULL);
-    }
-
-    public QueryCondition in(Collection<?> coll) {
-        return new QueryCondition(this, SqlConstant.IN, coll);
-    }
-
-    public QueryCondition in(Object... obj) {
-        if (ObjectUtil.isEmpty(obj)) {
-            return new QueryCondition(this, SqlConstant.IN, null);
-        }
-        return new QueryCondition(this, SqlConstant.IN, Arrays.asList(obj));
-    }
-
-    public QueryCondition notIn(Collection<?> coll) {
-        return new QueryCondition(this, SqlConstant.NOT_IN, coll);
-    }
-
-    public QueryCondition notIn(Object... obj) {
-        if (ObjectUtil.isEmpty(obj)) {
-            return new QueryCondition(this, SqlConstant.NOT_IN, null);
-        }
-        return new QueryCondition(this, SqlConstant.NOT_IN, Arrays.asList(obj));
-    }
-
-    private QueryColumn copy() {
-        return new QueryColumn(this.table, this.name, new ArrayList<>(this.queryColumnComputeList));
-    }
-
-    private QueryColumn compute(String symbol, Object obj) {
-        QueryColumn newQueryColumn = copy();
-        newQueryColumn.queryColumnComputeList.add(new QueryColumnCompute(symbol, obj));
-        return newQueryColumn;
+    @Override
+    protected QueryColumn copy() {
+        QueryColumn queryColumn = new QueryColumn(this.table, this.name);
+        queryColumn.queryColumnComputeList.addAll(queryColumnComputeList);
+        return queryColumn;
     }
 
     @Override
     public String toSql(Map<String, String> tableAliasMap, Map<String, Object> paramMap) {
-        StringJoiner joiner;
-        if (ObjectUtil.isEmpty(queryColumnComputeList)) {
-            joiner = new StringJoiner(StringPool.EMPTY);
-        } else {
-            joiner = new StringJoiner(StringPool.EMPTY, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET);
-        }
-
-        String tableAlias = SqlUtil.getTableAlias(table, tableAliasMap);
-        String queryColumnArithmeticStr = queryColumnComputeList
-                .stream()
-                .map(item -> item.toSql(tableAliasMap, paramMap))
-                .collect(Collectors.joining());
-
-        return joiner.add(tableAlias + StringPool.DOT + name).add(queryColumnArithmeticStr).toString();
+        String sql = SqlUtil.getTableAlias(table, tableAliasMap) + StringPool.DOT + name;
+        return spliceCompute(sql, tableAliasMap, paramMap);
     }
 
 }

+ 10 - 19
my-test/src/main/java/org/example/join/domain/QueryColumnFunction.java

@@ -1,46 +1,37 @@
 package org.example.join.domain;
 
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta;
-import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import org.apache.ibatis.reflection.property.PropertyNamer;
 import org.example.join.util.SqlUtil;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.StringJoiner;
 
-public class QueryColumnFunction implements IFormat, IQueryColumn {
+public class QueryColumnFunction extends AbstractQueryColumn implements IFormat, IQueryColumn {
 
     private final String fnName;
 
     private final List<Object> columns;
 
-    public QueryColumnFunction(String fnName) {
-        this.fnName = fnName;
-        this.columns = new ArrayList<>();
-    }
-
     public QueryColumnFunction(String fnName, Object... columns) {
-        this(fnName);
-        this.columns.addAll(Arrays.asList(columns));
+        this.fnName = fnName;
+        this.columns = Arrays.asList(columns);
     }
 
-    public <T> QueryColumnAlias as(SFunction<T, ?> function) {
-        LambdaMeta meta = LambdaUtils.extract(function);
-        String alias = StrUtil.toUnderlineCase(PropertyNamer.methodToProperty(meta.getImplMethodName()));
-        return new QueryColumnAlias(alias, this);
+    @Override
+    protected QueryColumnFunction copy() {
+        QueryColumnFunction queryColumnFunction = new QueryColumnFunction(this.fnName, this.columns.toArray());
+        queryColumnFunction.queryColumnComputeList.addAll(queryColumnComputeList);
+        return queryColumnFunction;
     }
 
     @Override
     public String toSql(Map<String, String> tableAliasMap, Map<String, Object> paramMap) {
         StringJoiner joiner = new StringJoiner(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET);
         columns.forEach(item -> SqlUtil.putValue(tableAliasMap, paramMap, joiner, item));
-        return fnName + joiner;
+        String sql = fnName + joiner;
+        return spliceCompute(sql, tableAliasMap, paramMap);
     }
 
 }

+ 7 - 13
my-test/src/main/java/org/example/join/domain/QueryCondition.java

@@ -13,19 +13,19 @@ import java.util.StringJoiner;
 
 public class QueryCondition implements IFormat {
 
-    private final QueryColumn column;
+    private final IQueryColumn column;
     private final String logic;
     private final Object value;
     private final List<QueryConditionConnect> queryConditionConnectList;
 
-    public QueryCondition(QueryColumn column, String logic, Object value) {
+    public QueryCondition(IQueryColumn column, String logic, Object value) {
         this.column = column;
         this.logic = logic;
         this.value = value;
         this.queryConditionConnectList = new ArrayList<>();
     }
 
-    public QueryCondition(QueryColumn column, String logic, Object value, List<QueryConditionConnect> queryConditionConnectList) {
+    public QueryCondition(IQueryColumn column, String logic, Object value, List<QueryConditionConnect> queryConditionConnectList) {
         this.column = column;
         this.logic = logic;
         this.value = value;
@@ -106,17 +106,11 @@ public class QueryCondition implements IFormat {
                 case SqlConstant.IS_NULL, SqlConstant.IS_NOT_NULL -> joiner.add(logic);
                 case SqlConstant.IN, SqlConstant.NOT_IN -> {
                     joiner.add(logic);
-                    Collection<?> inValue = (Collection<?>) value;
-                    int size = inValue.size();
-                    Object[] array = inValue.toArray();
+                    List<Object> inList = new ArrayList<>((Collection<?>) value);
                     joiner.add("(");
-                    for (int i = 0; i < size; i++) {
-                        SqlUtil.putValue(tableAliasMap, paramMap, joiner, array[i]);
-                        if (i == size - 1) {
-                            joiner.add(")");
-                        } else {
-                            joiner.add(",");
-                        }
+                    for (int i = 0; i < inList.size(); i++) {
+                        SqlUtil.putValue(tableAliasMap, paramMap, joiner, inList.get(i));
+                        joiner.add(inList.size() == i + 1 ? ")" : ",");
                     }
                 }
                 default -> {

+ 1 - 1
my-test/src/main/java/org/example/join/domain/QueryConditionOrder.java

@@ -10,7 +10,7 @@ public class QueryConditionOrder implements IFormat {
     /**
      * 查询列
      */
-    private final QueryColumn queryColumn;
+    private final IQueryColumn queryColumn;
 
     /**
      * 排序方式 ( asc desc )

+ 0 - 17
my-test/src/main/java/org/example/join/domain/RawQueryColumn.java

@@ -1,17 +0,0 @@
-package org.example.join.domain;
-
-import java.util.Map;
-
-public class RawQueryColumn implements IFormat, IQueryColumn {
-
-    private final String content;
-
-    public RawQueryColumn(Object content) {
-        this.content = String.valueOf(content);
-    }
-
-    @Override
-    public String toSql(Map<String, String> tableAliasMap, Map<String, Object> paramMap) {
-        return content;
-    }
-}

+ 6 - 6
my-test/src/test/java/MySpringBootTest.java

@@ -45,10 +45,10 @@ public class MySpringBootTest {
                         //dept_id,
                         //abs(parent_id).as(SysDept::getUpdateTime),
                         //replace(dept_id, "2", "3"),
-                        //concat("@", "1"),
                         now(),
-                        concat(dept_id, 1, "',(select config_value from sys_config where config_id = 1749335361951907842),'").as(SysDept::getEmail)
-                        //concat(dept_id, parent_id),
+                        concat("@", "1"),
+                        concat("777", "555").add(777).as(SysDept::getDeptId),
+                        concat(dept_id, parent_id)
                         //concat(dept_id,"sdasdsa"),
                         //dateFormat(now(), "%Y%m"),
                         //ifNull("2", "2")
@@ -56,9 +56,9 @@ public class MySpringBootTest {
                 .from(sys_dept)
                 .leftJoin(sys_user).on(user_id.eq(dept_id))
                 .where(
-                        //dept_id.add(parent_id).eq(parent_id)
-                        //create_by.eq(concat("dept_id", "@", "',(select config_value from sys_config where config_id = 1749335361951907842),'").as(SysDept::getEmail))
-                        //create_by.ne(98),
+                        concat("777", "555").add(777).ne(create_by),
+                        create_by.add(777).ne(concat("777", "555")),
+                        create_by.ne(concat("777", "555").add(777)).and(concat("777", "555").eq("sss"))
                         //create_by.gt(98),
                         //create_by.lt(98),
                         //create_by.ge(98),