24282 před 1 rokem
rodič
revize
4b2ed916f0

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

@@ -12,7 +12,7 @@ import org.example.join.domain.QueryConditionOrder;
 import java.util.ArrayList;
 import java.util.List;
 
-@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
 public class Sql<R> {
 
     protected final Class<R> resultCls;
@@ -22,6 +22,9 @@ public class Sql<R> {
     protected final List<QueryColumn> groupByList = new ArrayList<>();
     protected final List<QueryConditionOrder> orderByList = new ArrayList<>();
 
+    protected final List<Sql<R>> unionList = new ArrayList<>();
+    protected String unionType = StringPool.EMPTY;
+
     protected Boolean logic = false;
     protected Boolean distinct = false;
     protected String limit = StringPool.EMPTY;

+ 6 - 2
my-test/src/main/java/org/example/join/sql/SqlContext.java

@@ -19,11 +19,10 @@ public class SqlContext {
     private static final String PARAM_MAP = "paramMap";
     private static final String TABLE_ALIAS_MAP = "tableAliasMap";
 
-    public static void init(Sql<?> sql, Map<String, Object> paramMap) {
+    public static void init(Map<String, Object> paramMap) {
         Map<String, Object> map = new HashMap<>();
         map.put(PARAM_NUMBER, 1);
         map.put(PARAM_MAP, paramMap);
-        map.put(TABLE_ALIAS_MAP, createTableAliasMap(sql));
         threadLocal.set(map);
     }
 
@@ -48,6 +47,11 @@ public class SqlContext {
         return (Map<String, String>) map.get(TABLE_ALIAS_MAP);
     }
 
+    public static void setTableAliasMap(Sql<?> sql) {
+        Map<String, Object> map = threadLocal.get();
+        map.put(TABLE_ALIAS_MAP, createTableAliasMap(sql));
+    }
+
     public static String getTableAlias(Table table) {
         Map<String, String> tableAliasMap = getTableAliasMap();
         String tableAlias = table.getAlias();

+ 29 - 5
my-test/src/main/java/org/example/join/sql/SqlProvider.java

@@ -27,19 +27,43 @@ public class SqlProvider {
         try {
 
             // 初始化sql上下文
-            SqlContext.init(sql, paramMap);
+            SqlContext.init(paramMap);
 
-            // 拼接逻辑删除
-            spliceLogic(sql);
+            if (sql.unionList.isEmpty()) {
+                return toSqlStr(sql);
+            }
 
-            // 创建sql字符串
-            return createSql(sql);
+            StringBuilder sqlSb = new StringBuilder();
+            sql.unionList.forEach(itemSql -> appendSql(sqlSb, itemSql));
+            appendSql(sqlSb, sql);
+            return sqlSb.toString();
 
         } finally {
+
+            // 清空sql上下文数据
             SqlContext.remove();
         }
     }
 
+    private static void appendSql(StringBuilder sqlSb, Sql<?> sql) {
+        sqlSb.append(sql.unionType)
+                .append(StringPool.LEFT_BRACKET)
+                .append(toSqlStr(sql))
+                .append(StringPool.RIGHT_BRACKET);
+    }
+
+    private static String toSqlStr(Sql<?> sql) {
+
+        // 设置表别名
+        SqlContext.setTableAliasMap(sql);
+
+        // 拼接逻辑删除
+        spliceLogic(sql);
+
+        // 创建sql字符串
+        return createSql(sql);
+    }
+
     /**
      * 拼接逻辑删除
      */

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

@@ -72,6 +72,20 @@ public class SqlWrapper<R> {
         return this;
     }
 
+    public Select<R> union() {
+        Sql<R> unionSql = new Sql<>(sql.resultCls);
+        unionSql.unionType = SqlConstant.UNION;
+        unionSql.unionList.add(sql);
+        return new Select<>(unionSql);
+    }
+
+    public Select<R> unionAll() {
+        Sql<R> unionSql = new Sql<>(sql.resultCls);
+        unionSql.unionType = SqlConstant.UNION_ALL;
+        unionSql.unionList.add(sql);
+        return new Select<>(unionSql);
+    }
+
     public List<R> list() {
         List<?> result;
         if (CharSequence.class.isAssignableFrom(sql.resultCls)

+ 2 - 0
my-test/src/main/java/org/example/join/util/SqlConstant.java

@@ -12,6 +12,8 @@ public interface SqlConstant {
     String GROUP_BY = " group by ";
     String ORDER_BY = " order by ";
     String LIMIT = " limit ";
+    String UNION = " union ";
+    String UNION_ALL = " union all ";
     String AND = " and ";
     String OR = " or ";
     String ON = " on ";

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

@@ -1,4 +1,5 @@
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.dromara.system.domain.SysDept;
 import org.dromara.system.service.ISysUserService;
 import org.example.DromaraApplication;
@@ -34,7 +35,7 @@ public class MySpringBootTest {
     @Test
     public void testCache() {
 
-        SysDept list = Sql.create(SysDept.class)
+        Page<SysDept> list = Sql.create(SysDept.class)
                 //.logic()
                 .select(
                         parent_id,
@@ -67,8 +68,23 @@ public class MySpringBootTest {
                 )
                 .orderByAsc()
                 .groupBy()
-                .limit(1)
-                .one();
+
+                .union()
+
+                .logic()
+                .select(
+                        parent_id,
+                        tenant_id,
+                        dept_id
+                )
+                .from(sys_dept)
+                .leftJoin(sys_user).on(user_id.eq(dept_id))
+                .where(
+                )
+                .orderByAsc()
+                .groupBy()
+
+                .page(new Page<>(1, 10));
 
         System.out.println(JSONObject.toJSONString(list));