24282 1 жил өмнө
parent
commit
87c2622950

+ 5 - 5
my-test/src/main/java/org/example/join/model/AbstractQueryColumn.java

@@ -15,7 +15,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.StringJoiner;
 
-public abstract class AbstractQueryColumn implements IQueryColumn {
+public abstract class AbstractQueryColumn implements IFormat {
 
     /**
      * 计算列表
@@ -76,12 +76,12 @@ public abstract class AbstractQueryColumn implements IQueryColumn {
         return compute(SqlConstant.REMAINDER, number);
     }
 
-    public QueryConditionOrder asc() {
-        return new QueryConditionOrder(this, SqlConstant.ASC);
+    public QueryColumnOrder asc() {
+        return new QueryColumnOrder(this, SqlConstant.ASC);
     }
 
-    public QueryConditionOrder desc() {
-        return new QueryConditionOrder(this, SqlConstant.DESC);
+    public QueryColumnOrder desc() {
+        return new QueryColumnOrder(this, SqlConstant.DESC);
     }
 
     public QueryCondition eq(Object object) {

+ 150 - 0
my-test/src/main/java/org/example/join/model/DefaultFunction.java

@@ -0,0 +1,150 @@
+package org.example.join.model;
+
+import org.example.join.sql.SqlConstant;
+
+/**
+ * SQL 函数。
+ */
+public class DefaultFunction {
+
+    /**
+     * 绝对值
+     */
+    public static QueryFunction abs(Object obj) {
+        return new QueryFunction(SqlConstant.ABS, obj);
+    }
+
+    /**
+     * 平均值
+     */
+    public static QueryFunction avg(Object obj) {
+        return new QueryFunction(SqlConstant.AVG, obj);
+    }
+
+    /**
+     * 数量
+     */
+    public static QueryFunction count(Object obj) {
+        return new QueryFunction(SqlConstant.COUNT, obj);
+    }
+
+    /**
+     * 将字符串 s1,s2 等多个字符串合并为一个字符串。
+     */
+    public static QueryFunction concat(Object... objs) {
+        return new QueryFunction(SqlConstant.CONCAT, objs);
+    }
+
+    /**
+     * 计算两个时间相差天数
+     */
+    public static QueryFunction dateDiff(Object obj1, Object obj2) {
+        return new QueryFunction(SqlConstant.DATEDIFF, obj1, obj2);
+    }
+
+    /**
+     * 日期格式
+     */
+    public static QueryFunction dateFormat(Object obj1, Object obj2) {
+        return new QueryFunction(SqlConstant.DATE_FORMAT, obj1, obj2);
+    }
+
+    /**
+     * 判断处理
+     */
+    public static QueryFunction _if(Object obj1, Object obj2, Object obj3) {
+        return new QueryFunction(SqlConstant.IF, obj1, obj2, obj3);
+    }
+
+    /**
+     * 判断值是否为null
+     */
+    public static QueryFunction ifNull(Object obj1, Object obj2) {
+        return new QueryFunction(SqlConstant.IFNULL, obj1, obj2);
+    }
+
+    /**
+     * 最大值
+     */
+    public static QueryFunction max(IQueryColumn queryColumn) {
+        return new QueryFunction(SqlConstant.MAX, queryColumn);
+    }
+
+    /**
+     * 最小值
+     */
+    public static QueryFunction min(IQueryColumn queryColumn) {
+        return new QueryFunction(SqlConstant.MIN, queryColumn);
+    }
+
+    /**
+     * 当前系统时间
+     */
+    public static QueryFunction now() {
+        return new QueryFunction(SqlConstant.NOW);
+    }
+
+    /**
+     * 替换字符串
+     */
+    public static QueryFunction replace(IQueryColumn queryColumn, Object obj1, Object obj2) {
+        return new QueryFunction(SqlConstant.REPLACE, queryColumn, obj1, obj2);
+    }
+
+    /**
+     * 四舍五入
+     */
+    public static QueryFunction round(IQueryColumn queryColumn, Number number) {
+        return new QueryFunction(SqlConstant.ROUND, queryColumn, number);
+    }
+
+    /**
+     * 截取字符串
+     */
+    public static QueryFunction substr(IQueryColumn queryColumn, int position) {
+        return new QueryFunction(SqlConstant.SUBSTR, queryColumn, position);
+    }
+
+    /**
+     * 截取字符串
+     */
+    public static QueryFunction substr(IQueryColumn queryColumn, int position, int length) {
+        return new QueryFunction(SqlConstant.SUBSTR, queryColumn, position, length);
+    }
+
+    /**
+     * 获取字符个数
+     */
+    public static QueryFunction length(Object obj) {
+        return new QueryFunction(SqlConstant.LENGTH, obj);
+    }
+
+    /**
+     * 获取年
+     */
+    public static QueryFunction year(Object obj) {
+        return new QueryFunction(SqlConstant.YEAR, obj);
+    }
+
+    /**
+     * 获取月
+     */
+    public static QueryFunction month(Object obj) {
+        return new QueryFunction(SqlConstant.MONTH, obj);
+    }
+
+    /**
+     * 获取日
+     */
+    public static QueryFunction day(Object obj) {
+        return new QueryFunction(SqlConstant.DAY, obj);
+    }
+
+    /**
+     * 获取小时
+     */
+    public static QueryFunction hour(Object obj) {
+        return new QueryFunction(SqlConstant.HOUR, obj);
+    }
+
+}

+ 0 - 4
my-test/src/main/java/org/example/join/model/IQueryColumn.java

@@ -2,8 +2,4 @@ package org.example.join.model;
 
 public interface IQueryColumn extends IFormat {
 
-    static IQueryColumn field(Object obj) {
-        return obj::toString;
-    }
-
 }

+ 4 - 4
my-test/src/main/java/org/example/join/model/ITable.java

@@ -4,12 +4,12 @@ public interface ITable extends IFormat {
 
     String getAlias();
 
-    default QueryColumn field(String fieldName) {
-        return new QueryColumn(getAlias(), fieldName);
+    default QueryColumnField field(String fieldName) {
+        return new QueryColumnField(getAlias(), fieldName);
     }
 
-    default QueryColumn field(QueryColumn queryColumn) {
-        return new QueryColumn(getAlias(), queryColumn.getName());
+    default QueryColumnField field(QueryColumnField queryColumnField) {
+        return new QueryColumnField(getAlias(), queryColumnField.getName());
     }
 
 }

+ 41 - 13
my-test/src/main/java/org/example/join/model/QueryColumn.java

@@ -1,32 +1,60 @@
 package org.example.join.model;
 
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.example.join.sql.SqlContext;
 
-@Getter
-@RequiredArgsConstructor
-public class QueryColumn extends AbstractQueryColumn {
+import java.util.ArrayList;
+import java.util.List;
+
+public class QueryColumn extends AbstractQueryColumn implements IQueryColumn {
 
     /**
-     * 表别名
+     * 查询值
      */
-    private final String tableAlias;
+    private final Object value;
 
     /**
-     * 字段名
+     * 查询参数
      */
-    private final String name;
+    private final List<Object> params = new ArrayList<>();
+
+    public QueryColumn(Number value) {
+        this.value = value;
+    }
+
+    public QueryColumn(String value, Object... params) {
+        this.value = value;
+        if (ObjectUtil.isAllNotEmpty(params)) {
+            this.params.addAll(ListUtil.toList(params));
+        }
+    }
+
+    private QueryColumn(Object value) {
+        this.value = value;
+    }
 
     @Override
-    protected QueryColumn copy() {
-        return new QueryColumn(this.tableAlias, this.name);
+    protected AbstractQueryColumn copy() {
+        QueryColumn queryColumn = new QueryColumn(this.value);
+        queryColumn.params.addAll(this.params);
+        return queryColumn;
     }
 
     @Override
     public String toSql() {
-        String sql = tableAlias + StringPool.DOT + name;
-        return spliceCompute(sql);
+        if (value instanceof String str) {
+            Object[] array = params.stream().map(item -> {
+                String paramKey = SqlContext.getParamKey();
+                SqlContext.getParamMap().put(paramKey, item);
+                return StringPool.HASH_LEFT_BRACE + paramKey + StringPool.RIGHT_BRACE;
+            }).toArray();
+            return StrUtil.indexedFormat(str, array);
+        } else {
+            return value.toString();
+        }
     }
 
 }

+ 1 - 1
my-test/src/main/java/org/example/join/model/QueryColumnAlias.java

@@ -9,7 +9,7 @@ public class QueryColumnAlias implements IQueryColumn {
     /**
      * 查询列
      */
-    private final IQueryColumn queryColumn;
+    private final IFormat queryColumn;
 
     /**
      * 字段别名

+ 32 - 0
my-test/src/main/java/org/example/join/model/QueryColumnField.java

@@ -0,0 +1,32 @@
+package org.example.join.model;
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor
+public class QueryColumnField extends AbstractQueryColumn implements IQueryColumn {
+
+    /**
+     * 表别名
+     */
+    private final String tableAlias;
+
+    /**
+     * 字段名
+     */
+    private final String name;
+
+    @Override
+    protected QueryColumnField copy() {
+        return new QueryColumnField(this.tableAlias, this.name);
+    }
+
+    @Override
+    public String toSql() {
+        String sql = tableAlias + StringPool.DOT + name;
+        return spliceCompute(sql);
+    }
+
+}

+ 41 - 0
my-test/src/main/java/org/example/join/model/QueryColumnFields.java

@@ -0,0 +1,41 @@
+package org.example.join.model;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringJoiner;
+
+@Getter
+public class QueryColumnFields implements IQueryColumn {
+
+    private final List<IQueryColumn> queryColumnList = new ArrayList<>();
+
+    public QueryColumnFields(IQueryColumn... iQueryColumns) {
+        queryColumnList.addAll(ListUtil.toList(iQueryColumns));
+    }
+
+    public void add(IQueryColumn... iQueryColumns) {
+        queryColumnList.addAll(ListUtil.toList(iQueryColumns));
+    }
+
+    @Override
+    public String toSql() {
+        StringJoiner joiner = new StringJoiner(StringPool.COMMA);
+        queryColumnList.forEach(item -> {
+            if (ObjectUtil.isNull(item)) {
+                return;
+            }
+            String sql = item.toSql();
+            if (StrUtil.isNotEmpty(sql)) {
+                joiner.add(sql);
+            }
+        });
+        return joiner.toString();
+    }
+
+}

+ 2 - 2
my-test/src/main/java/org/example/join/model/QueryConditionOrder.java → my-test/src/main/java/org/example/join/model/QueryColumnOrder.java

@@ -3,12 +3,12 @@ package org.example.join.model;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-public class QueryConditionOrder implements IFormat {
+public class QueryColumnOrder implements IFormat {
 
     /**
      * 查询列
      */
-    private final IQueryColumn queryColumn;
+    private final IFormat queryColumn;
 
     /**
      * 排序方式 ( asc desc )

+ 1 - 1
my-test/src/main/java/org/example/join/model/QueryCondition.java

@@ -15,7 +15,7 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public class QueryCondition implements IFormat {
 
-    private final IQueryColumn column;
+    private final IFormat column;
     private final String logic;
     private final Object value;
     private final List<QueryConditionConnect> queryConditionConnectList = new ArrayList<>();

+ 4 - 4
my-test/src/main/java/org/example/join/model/QueryColumnFunction.java → my-test/src/main/java/org/example/join/model/QueryFunction.java

@@ -7,7 +7,7 @@ import org.example.join.sql.SqlContext;
 import java.util.List;
 import java.util.StringJoiner;
 
-public class QueryColumnFunction extends AbstractQueryColumn {
+public class QueryFunction extends AbstractQueryColumn {
 
     /**
      * 方法名
@@ -19,14 +19,14 @@ public class QueryColumnFunction extends AbstractQueryColumn {
      */
     private final List<Object> columns;
 
-    public QueryColumnFunction(String fnName, Object... columns) {
+    public QueryFunction(String fnName, Object... columns) {
         this.fnName = fnName;
         this.columns = ListUtil.toList(columns);
     }
 
     @Override
-    protected QueryColumnFunction copy() {
-        return new QueryColumnFunction(this.fnName, this.columns.toArray());
+    protected QueryFunction copy() {
+        return new QueryFunction(this.fnName, this.columns.toArray());
     }
 
     @Override

+ 0 - 150
my-test/src/main/java/org/example/join/model/QueryMethod.java

@@ -1,150 +0,0 @@
-package org.example.join.model;
-
-import org.example.join.sql.SqlConstant;
-
-/**
- * SQL 函数。
- */
-public class QueryMethod {
-
-    /**
-     * 绝对值
-     */
-    public static QueryColumnFunction abs(Object obj) {
-        return new QueryColumnFunction(SqlConstant.ABS, obj);
-    }
-
-    /**
-     * 平均值
-     */
-    public static QueryColumnFunction avg(Object obj) {
-        return new QueryColumnFunction(SqlConstant.AVG, obj);
-    }
-
-    /**
-     * 数量
-     */
-    public static QueryColumnFunction count(Object obj) {
-        return new QueryColumnFunction(SqlConstant.COUNT, obj);
-    }
-
-    /**
-     * 将字符串 s1,s2 等多个字符串合并为一个字符串。
-     */
-    public static QueryColumnFunction concat(Object... objs) {
-        return new QueryColumnFunction(SqlConstant.CONCAT, objs);
-    }
-
-    /**
-     * 计算两个时间相差天数
-     */
-    public static QueryColumnFunction dateDiff(Object obj1, Object obj2) {
-        return new QueryColumnFunction(SqlConstant.DATEDIFF, obj1, obj2);
-    }
-
-    /**
-     * 日期格式
-     */
-    public static QueryColumnFunction dateFormat(Object obj1, Object obj2) {
-        return new QueryColumnFunction(SqlConstant.DATE_FORMAT, obj1, obj2);
-    }
-
-    /**
-     * 判断处理
-     */
-    public static QueryColumnFunction _if(Object obj1, Object obj2, Object obj3) {
-        return new QueryColumnFunction(SqlConstant.IF, obj1, obj2, obj3);
-    }
-
-    /**
-     * 判断值是否为null
-     */
-    public static QueryColumnFunction ifNull(Object obj1, Object obj2) {
-        return new QueryColumnFunction(SqlConstant.IFNULL, obj1, obj2);
-    }
-
-    /**
-     * 最大值
-     */
-    public static QueryColumnFunction max(IQueryColumn queryColumn) {
-        return new QueryColumnFunction(SqlConstant.MAX, queryColumn);
-    }
-
-    /**
-     * 最小值
-     */
-    public static QueryColumnFunction min(IQueryColumn queryColumn) {
-        return new QueryColumnFunction(SqlConstant.MIN, queryColumn);
-    }
-
-    /**
-     * 当前系统时间
-     */
-    public static QueryColumnFunction now() {
-        return new QueryColumnFunction(SqlConstant.NOW);
-    }
-
-    /**
-     * 替换字符串
-     */
-    public static QueryColumnFunction replace(IQueryColumn queryColumn, Object obj1, Object obj2) {
-        return new QueryColumnFunction(SqlConstant.REPLACE, queryColumn, obj1, obj2);
-    }
-
-    /**
-     * 四舍五入
-     */
-    public static QueryColumnFunction round(IQueryColumn queryColumn, Number number) {
-        return new QueryColumnFunction(SqlConstant.ROUND, queryColumn, number);
-    }
-
-    /**
-     * 截取字符串
-     */
-    public static QueryColumnFunction substr(IQueryColumn queryColumn, int position) {
-        return new QueryColumnFunction(SqlConstant.SUBSTR, queryColumn, position);
-    }
-
-    /**
-     * 截取字符串
-     */
-    public static QueryColumnFunction substr(IQueryColumn queryColumn, int position, int length) {
-        return new QueryColumnFunction(SqlConstant.SUBSTR, queryColumn, position, length);
-    }
-
-    /**
-     * 获取字符个数
-     */
-    public static QueryColumnFunction length(Object obj) {
-        return new QueryColumnFunction(SqlConstant.LENGTH, obj);
-    }
-
-    /**
-     * 获取年
-     */
-    public static QueryColumnFunction year(Object obj) {
-        return new QueryColumnFunction(SqlConstant.YEAR, obj);
-    }
-
-    /**
-     * 获取月
-     */
-    public static QueryColumnFunction month(Object obj) {
-        return new QueryColumnFunction(SqlConstant.MONTH, obj);
-    }
-
-    /**
-     * 获取日
-     */
-    public static QueryColumnFunction day(Object obj) {
-        return new QueryColumnFunction(SqlConstant.DAY, obj);
-    }
-
-    /**
-     * 获取小时
-     */
-    public static QueryColumnFunction hour(Object obj) {
-        return new QueryColumnFunction(SqlConstant.HOUR, obj);
-    }
-
-}

+ 8 - 8
my-test/src/main/java/org/example/join/sql/Sql.java

@@ -8,9 +8,9 @@ import lombok.RequiredArgsConstructor;
 import org.example.join.model.IFormat;
 import org.example.join.model.IQueryColumn;
 import org.example.join.model.ITable;
-import org.example.join.model.QueryColumn;
+import org.example.join.model.QueryColumnField;
 import org.example.join.model.QueryCondition;
-import org.example.join.model.QueryConditionOrder;
+import org.example.join.model.QueryColumnOrder;
 import org.example.join.model.Table;
 import org.example.join.model.TableJoin;
 import org.example.join.model.TableSublist;
@@ -26,8 +26,8 @@ public class Sql implements IFormat {
     protected final List<IQueryColumn> queryFieldsList = new ArrayList<>();
     protected final List<ITable> queryTableList = new ArrayList<>();
     protected final List<QueryCondition> queryConditionList = new ArrayList<>();
-    protected final List<QueryColumn> groupByList = new ArrayList<>();
-    protected final List<QueryConditionOrder> orderByList = new ArrayList<>();
+    protected final List<QueryColumnField> groupByList = new ArrayList<>();
+    protected final List<QueryColumnOrder> orderByList = new ArrayList<>();
     protected final List<Sql> unionList = new ArrayList<>();
 
     protected Boolean logic = false;
@@ -87,14 +87,14 @@ public class Sql implements IFormat {
             if (iTable instanceof Table table) {
                 String tableDelFlag = SqlContext.getTableDelFlag(table);
                 if (ObjectUtil.isNotEmpty(tableDelFlag)) {
-                    QueryColumn queryColumn = new QueryColumn(table.getAlias(), tableDelFlag);
-                    sql.queryConditionList.add(0, new QueryCondition(queryColumn, SqlConstant.EQ, sql.logic ? 1 : 0));
+                    QueryColumnField queryColumnField = new QueryColumnField(table.getAlias(), tableDelFlag);
+                    sql.queryConditionList.add(0, new QueryCondition(queryColumnField, SqlConstant.EQ, sql.logic ? 1 : 0));
                 }
             } else if (iTable instanceof TableJoin tableJoin && tableJoin.getTable() instanceof Table table) {
                 String tableDelFlag = SqlContext.getTableDelFlag(table);
                 if (ObjectUtil.isNotEmpty(tableDelFlag)) {
-                    QueryColumn queryColumn = new QueryColumn(table.getAlias(), tableDelFlag);
-                    tableJoin.getQueryConditionList().add(new QueryCondition(queryColumn, SqlConstant.EQ, sql.logic ? 1 : 0));
+                    QueryColumnField queryColumnField = new QueryColumnField(table.getAlias(), tableDelFlag);
+                    tableJoin.getQueryConditionList().add(new QueryCondition(queryColumnField, SqlConstant.EQ, sql.logic ? 1 : 0));
                 }
             }
         }

+ 7 - 3
my-test/src/main/java/org/example/join/sql/SqlContext.java

@@ -35,8 +35,7 @@ public class SqlContext {
         } else {
             String mapKey = getParamKey();
             joiner.add(StringPool.HASH_LEFT_BRACE + mapKey + StringPool.RIGHT_BRACE);
-            Map<String, Object> map = threadLocal.get();
-            ((Map<String, Object>) map.get(PARAM_MAP)).put(mapKey, value);
+            getParamMap().put(mapKey, value);
         }
     }
 
@@ -49,11 +48,16 @@ public class SqlContext {
         return logicDeleteFieldInfo.getColumn();
     }
 
-    private static String getParamKey() {
+    public static String getParamKey() {
         Map<String, Object> map = threadLocal.get();
         int paramNumber = (int) map.get(PARAM_NUMBER);
         map.put(PARAM_NUMBER, paramNumber + 1);
         return SqlConstant.SQL_PARAM + paramNumber;
     }
 
+    public static Map<String, Object> getParamMap() {
+        Map<String, Object> map = threadLocal.get();
+        return (Map<String, Object>) map.get(PARAM_MAP);
+    }
+
 }

+ 14 - 14
my-test/src/main/java/org/example/join/sql/SqlWrapper.java

@@ -11,9 +11,9 @@ import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 import org.example.join.JoinMapper;
 import org.example.join.model.AbstractQueryColumn;
-import org.example.join.model.QueryColumn;
+import org.example.join.model.QueryColumnField;
 import org.example.join.model.QueryCondition;
-import org.example.join.model.QueryConditionOrder;
+import org.example.join.model.QueryColumnOrder;
 import org.example.join.model.Table;
 import org.example.join.model.TableSublist;
 
@@ -51,30 +51,30 @@ public class SqlWrapper extends AbstractQueryColumn {
         return this;
     }
 
-    public SqlWrapper groupBy(QueryColumn... queryColumns) {
-        if (ObjectUtil.isNotEmpty(queryColumns)) {
-            sql.groupByList.addAll(ListUtil.toList(queryColumns));
+    public SqlWrapper groupBy(QueryColumnField... queryColumnFields) {
+        if (ObjectUtil.isNotEmpty(queryColumnFields)) {
+            sql.groupByList.addAll(ListUtil.toList(queryColumnFields));
         }
         return this;
     }
 
-    public SqlWrapper orderBy(QueryConditionOrder... queryConditionOrders) {
-        if (ObjectUtil.isNotEmpty(queryConditionOrders)) {
-            sql.orderByList.addAll(ListUtil.toList(queryConditionOrders));
+    public SqlWrapper orderBy(QueryColumnOrder... queryColumnOrders) {
+        if (ObjectUtil.isNotEmpty(queryColumnOrders)) {
+            sql.orderByList.addAll(ListUtil.toList(queryColumnOrders));
         }
         return this;
     }
 
-    public SqlWrapper orderByAsc(QueryColumn... queryColumns) {
-        if (ObjectUtil.isNotEmpty(queryColumns)) {
-            sql.orderByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).map(QueryColumn::asc).toList());
+    public SqlWrapper orderByAsc(QueryColumnField... queryColumnFields) {
+        if (ObjectUtil.isNotEmpty(queryColumnFields)) {
+            sql.orderByList.addAll(Arrays.stream(queryColumnFields).filter(Objects::nonNull).map(QueryColumnField::asc).toList());
         }
         return this;
     }
 
-    public SqlWrapper orderByDesc(QueryColumn... queryColumns) {
-        if (ObjectUtil.isNotEmpty(queryColumns)) {
-            sql.orderByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).map(QueryColumn::desc).toList());
+    public SqlWrapper orderByDesc(QueryColumnField... queryColumnFields) {
+        if (ObjectUtil.isNotEmpty(queryColumnFields)) {
+            sql.orderByList.addAll(Arrays.stream(queryColumnFields).filter(Objects::nonNull).map(QueryColumnField::desc).toList());
         }
         return this;
     }

+ 19 - 18
my-test/src/test/java/MySpringBootTest.java

@@ -1,8 +1,9 @@
 import com.alibaba.fastjson.JSONObject;
 import org.dromara.system.domain.SysDept;
 import org.example.DromaraApplication;
-import org.example.join.model.IQueryColumn;
 import org.example.join.model.QueryColumn;
+import org.example.join.model.QueryColumnField;
+import org.example.join.model.QueryColumnFields;
 import org.example.join.model.Table;
 import org.example.join.model.TableSublist;
 import org.example.join.sql.Sql;
@@ -18,28 +19,27 @@ import java.util.List;
 public class MySpringBootTest {
 
     public static final Table sys_dept = new Table("sys_dept");
-    public final QueryColumn dept_id = sys_dept.field("dept_id");
-    public final QueryColumn tenant_id = sys_dept.field("tenant_id");
-    public final QueryColumn parent_id = sys_dept.field("parent_id");
-    public final QueryColumn ancestors = sys_dept.field("ancestors");
-    public final QueryColumn status = sys_dept.field("status");
+    public final QueryColumnField dept_id = sys_dept.field("dept_id");
+    public final QueryColumnField tenant_id = sys_dept.field("tenant_id");
+    public final QueryColumnField parent_id = sys_dept.field("parent_id");
+    public final QueryColumnField ancestors = sys_dept.field("ancestors");
+    public final QueryColumnField status = sys_dept.field("status");
+    public final QueryColumnFields sysDeptAll = new QueryColumnFields(dept_id, tenant_id, parent_id, ancestors);
 
     public static final Table sys_user = new Table("sys_user");
-    public final QueryColumn user_id = sys_user.field("user_id");
-    public final QueryColumn user_name = sys_user.field("user_name");
-    public final QueryColumn nick_name = sys_user.field("nick_name");
-    public final QueryColumn sex = sys_user.field("sex");
-    public final QueryColumn create_by = sys_user.field("create_by");
+    public final QueryColumnField user_id = sys_user.field("user_id");
+    public final QueryColumnField user_name = sys_user.field("user_name");
+    public final QueryColumnField nick_name = sys_user.field("nick_name");
+    public final QueryColumnField sex = sys_user.field("sex");
+    public final QueryColumnField create_by = sys_user.field("create_by");
 
     @Test
     public void testCache() {
 
         TableSublist childTable = Sql.create()
                 .select(
-                        dept_id,
-                        tenant_id,
-                        status,
-                        ancestors
+                        sysDeptAll,
+                        status
                 )
                 .from(sys_dept)
                 .tableAs(sys_dept);
@@ -48,11 +48,11 @@ public class MySpringBootTest {
                 //.logic()
                 //.distinct()
                 .select(
-                        dept_id,
+                        dept_id.as("aaa"),
                         childTable.field(tenant_id),
                         childTable.field("status"),
-                        IQueryColumn.field("sys_dept.ancestors ancestors"),
-                        Sql.create().select(dept_id).from(sys_dept).limit(1).as("ccc")
+                        Sql.create().select(dept_id).from(sys_dept).limit(1).as("ccc"),
+                        new QueryColumn("{0}", "ancestors").as("sss")
                 )
                 .from(childTable)
                 .leftJoin(sys_user).on(childTable.field(dept_id).eq(user_id))
@@ -60,6 +60,7 @@ public class MySpringBootTest {
                         dept_id.in(Sql.create().select(dept_id).from(sys_dept)),
                         Sql.create().select(dept_id).from(sys_dept).limit(1).eq(100)
                 )
+                .orderBy(new QueryColumn("aaa").asc())
                 .list(SysDept.class);
 
         System.out.println(JSONObject.toJSONString(list));