From b1188a6e51758b6eef07c33ef277655cc3356e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B8=85?= <1474983351@qq.com> Date: Mon, 28 Oct 2024 16:24:53 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fixed:=20=E5=AD=90=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=9D=A1=E4=BB=B6=E6=B2=A1=E6=9C=89=E6=8B=AC?= =?UTF-8?q?=E5=8F=B7=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mybatisflex/core/query/SelectQueryColumn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java index 2326a57c..3bb2fc98 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/SelectQueryColumn.java @@ -41,7 +41,7 @@ public class SelectQueryColumn extends QueryColumn implements HasParamsColumn { @Override protected String toConditionSql(List queryTables, IDialect dialect) { - return dialect.forSelectByQuery(queryWrapper); + return WrapperUtil.withBracket(dialect.forSelectByQuery(queryWrapper)); } @Override From 98b3c7b92ed7c0a026c53a23724ae80c0a757cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B8=85?= <1474983351@qq.com> Date: Mon, 28 Oct 2024 16:26:52 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fixed:=20=E5=AD=90=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=94=A8=E5=88=B0=E4=BA=86=E5=A4=96=E9=83=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=9A=84=E5=88=97=E6=97=B6=EF=BC=8C=E4=B8=A4=E4=B8=AA=E5=88=97?= =?UTF-8?q?=E9=87=8D=E5=90=8D=E6=B2=A1=E6=9C=89=E5=88=97=E5=90=8D=E6=8C=87?= =?UTF-8?q?=E5=90=91=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/core/query/QueryColumn.java | 15 +++++-- .../test/common/QueryWrapperTest.java | 42 ++++++++++++++++++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java index d79efb10..01a12286 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java @@ -977,15 +977,17 @@ public class QueryColumn implements CloneSupport, Conditional, Conditional it = queryTables.listIterator(queryTables.size()); diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/QueryWrapperTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/QueryWrapperTest.java index 5c782c85..7fe29011 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/QueryWrapperTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/QueryWrapperTest.java @@ -16,16 +16,23 @@ package com.mybatisflex.test.common; +import com.github.vertical_blank.sqlformatter.SqlFormatter; import com.mybatisflex.core.query.CPI; import com.mybatisflex.core.query.QueryCondition; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.RawQueryTable; +import com.mybatisflex.test.model.table.RoleTableDef; +import com.mybatisflex.test.model.table.UserTableDef; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.Arrays; -import static com.mybatisflex.core.query.QueryMethods.*; +import static com.mybatisflex.core.query.QueryMethods.case_; +import static com.mybatisflex.core.query.QueryMethods.column; +import static com.mybatisflex.core.query.QueryMethods.count; +import static com.mybatisflex.core.query.QueryMethods.distinct; +import static com.mybatisflex.core.query.QueryMethods.select; import static com.mybatisflex.test.model.table.RoleTableDef.ROLE; import static com.mybatisflex.test.model.table.UserRoleTableDef.USER_ROLE; import static com.mybatisflex.test.model.table.UserTableDef.USER; @@ -132,4 +139,37 @@ class QueryWrapperTest { System.out.println(queryWrapper.toSQL()); } + @Test + void test05() { + RoleTableDef r = ROLE.as("r"); + UserTableDef u = USER.as("u"); + + QueryWrapper queryWrapper = QueryWrapper.create() + .select(USER.USER_NAME) + .from(USER) + .leftJoin(u).on(u.USER_ID.eq(USER.USER_ID)) + .where(USER.USER_ID.eq(1)) + // 子查询里面用了父查询里面的表 + .and(column(select(r.ROLE_ID).from(r).where(u.USER_ID.eq(r.ROLE_ID))).le(2)); + + String sql = SqlFormatter.format(queryWrapper.toSQL()); + System.out.println(sql); + + Assertions.assertEquals("SELECT\n" + + " ` tb_user `.` user_name `\n" + + "FROM\n" + + " ` tb_user `\n" + + " LEFT JOIN ` tb_user ` AS ` u ` ON ` u `.` user_id ` = ` tb_user `.` user_id `\n" + + "WHERE\n" + + " ` tb_user `.` user_id ` = 1\n" + + " AND (\n" + + " SELECT\n" + + " ` r `.` role_id `\n" + + " FROM\n" + + " ` tb_role ` AS ` r `\n" + + " WHERE\n" + + " ` u `.` user_id ` = ` r `.` role_id `\n" + + " ) <= 2", sql); + } + } From 37e76da4d9cec94d902e0e4a8b0018c742957ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B8=85?= <1474983351@qq.com> Date: Mon, 28 Oct 2024 16:27:41 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fixed:=20=E6=97=A0=E6=B3=95=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20COUNT=20=E6=9F=A5=E8=AF=A2=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E5=85=B3=E9=97=AD=EF=BC=9Ahttps://gitee.com/?= =?UTF-8?q?mybatis-flex/mybatis-flex/issues/IAYAHL=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/util/MapperUtil.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java index b10b3860..6212a313 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/MapperUtil.java @@ -69,17 +69,20 @@ public class MapperUtil { .select(count().as("total")) .from(queryWrapper).as("t"); } - public static QueryWrapper rawCountQueryWrapper(QueryWrapper queryWrapper,List customCountColumns) { - return customCountColumns!=null?QueryWrapper.create() + + public static QueryWrapper rawCountQueryWrapper(QueryWrapper queryWrapper, List customCountColumns) { + return customCountColumns != null ? QueryWrapper.create() .select(customCountColumns) - .from(queryWrapper).as("t"):rawCountQueryWrapper(queryWrapper); + .from(queryWrapper).as("t") : rawCountQueryWrapper(queryWrapper); } + /** * 优化 COUNT 查询语句。 */ public static QueryWrapper optimizeCountQueryWrapper(QueryWrapper queryWrapper) { return optimizeCountQueryWrapper(queryWrapper, Collections.singletonList(count().as("total"))); } + /** * 优化 COUNT 查询语句。 */ @@ -88,10 +91,10 @@ public class MapperUtil { QueryWrapper clone = queryWrapper.clone(); List unions = CPI.getUnions(clone); - if(!CollectionUtil.isEmpty(unions)){ + if (!CollectionUtil.isEmpty(unions)) { List newUnions = new ArrayList<>(unions.size()); for (UnionWrapper union : unions) { - QueryWrapper unionQuery = optimizeCountQueryWrapper(union.getQueryWrapper().clone(),null); + QueryWrapper unionQuery = optimizeCountQueryWrapper(union.getQueryWrapper().clone(), null); UnionWrapper clone1 = union.clone(); clone1.setQueryWrapper(unionQuery); newUnions.add(clone1); @@ -108,17 +111,17 @@ public class MapperUtil { // 如果有 distinct、group by、having 等语句则不优化 // 这种一旦优化了就会造成 count 语句查询出来的值不对 if (hasDistinct(selectColumns) || hasGroupBy(groupByColumns) || havingCondition != null) { - return clone; + return rawCountQueryWrapper(clone); } // 判断能不能清除 join 语句 if (canClearJoins(clone)) { CPI.setJoins(clone, null); } // 将 select 里面的列换成 COUNT(*) AS `total` - if(customCountColumns!=null){ - if(hasUnion(clone)){ - return rawCountQueryWrapper(clone,customCountColumns); - }else { + if (customCountColumns != null) { + if (hasUnion(clone)) { + return rawCountQueryWrapper(clone, customCountColumns); + } else { CPI.setSelectColumns(clone, customCountColumns); } }