From 722808b6ed2362984d60aebdd8b0dd8687bc4f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Mon, 10 Jul 2023 16:17:08 +0800 Subject: [PATCH] feat: add sqlServer 2005 LimitOffsetProcessor --- .../core/dialect/LimitOffsetProcessor.java | 24 +++---------------- .../coretest/SqlServer2005DialectTester.java | 4 +++- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/LimitOffsetProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/LimitOffsetProcessor.java index ade18638..3fd7f017 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/LimitOffsetProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/LimitOffsetProcessor.java @@ -111,26 +111,7 @@ public interface LimitOffsetProcessor { } List queryTables = CPI.getQueryTables(queryWrapper); - -// String selectColumnString; -// List selectColumns = CPI.getSelectColumns(queryWrapper); -// if (selectColumns == null || selectColumns.isEmpty()){ -// selectColumnString = "*"; -// }else { -// StringBuilder columnsSql = new StringBuilder(); -// int index = 0; -// for (QueryColumn selectColumn : selectColumns) { -// String selectColumnSql = CPI.toSelectSql(selectColumn, queryTables, dialect); -// columnsSql.append(selectColumnSql); -// if (index != selectColumns.size() - 1) { -// columnsSql.append(DELIMITER); -// } -// index++; -// } -// selectColumnString = columnsSql.toString(); -// } - - + String originalSQL = sql.toString(); String orderByString; List orderBys = CPI.getOrderBys(queryWrapper); if (orderBys == null || orderBys.isEmpty()) { @@ -145,11 +126,12 @@ public interface LimitOffsetProcessor { } index++; } + originalSQL = originalSQL.substring(0, sql.lastIndexOf(ORDER_BY)); orderByString = orderBySql.toString(); } StringBuilder newSql = new StringBuilder("WITH temp_datas AS("); - newSql.append("SELECT ROW_NUMBER() OVER (").append(orderByString).append(") as __rn,").append(sql.substring(6)); + newSql.append("SELECT ROW_NUMBER() OVER (").append(orderByString).append(") as __rn,").append(originalSQL.substring(6)); newSql.append(")"); newSql.append(" SELECT * FROM temp_datas WHERE __rn BETWEEN ").append(limitOffset + 1).append(" AND ").append(limitOffset + limitRows); newSql.append(" ORDER BY __rn"); diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/SqlServer2005DialectTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/SqlServer2005DialectTester.java index 5ca9916a..2c2ee75e 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/SqlServer2005DialectTester.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/SqlServer2005DialectTester.java @@ -1,6 +1,7 @@ package com.mybatisflex.coretest; import com.mybatisflex.core.dialect.IDialect; +import com.mybatisflex.core.dialect.KeywordWrap; import com.mybatisflex.core.dialect.LimitOffsetProcessor; import com.mybatisflex.core.dialect.impl.CommonsDialectImpl; import com.mybatisflex.core.query.QueryWrapper; @@ -18,9 +19,10 @@ public class SqlServer2005DialectTester { .from(ACCOUNT) .where(ACCOUNT.ID.in("100","200")) .and(ACCOUNT.SEX.eq(1)) + .orderBy(ACCOUNT.ID.desc()) .limit(10,10); - IDialect dialect = new CommonsDialectImpl(LimitOffsetProcessor.SQLSERVER_2005); + IDialect dialect = new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS,LimitOffsetProcessor.SQLSERVER_2005); String sql = dialect.forSelectByQuery(query); System.out.println(sql); }