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 21f79b45..14c26869 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 @@ -113,7 +113,10 @@ public interface LimitOffsetProcessor { limitOffset = 0L; } + // fix-bug:#I87AOA QueryWrapper 构建的SQL 与 执行的SQL不一致 List queryTables = CPI.getQueryTables(queryWrapper); + List joinTables = CPI.getJoinTables(queryWrapper); + List allTables = CollectionUtil.merge(queryTables, joinTables); String originalSQL = sql.toString(); String orderByString; List orderBys = CPI.getOrderBys(queryWrapper); @@ -123,7 +126,7 @@ public interface LimitOffsetProcessor { StringBuilder orderBySql = new StringBuilder(ORDER_BY); int index = 0; for (QueryOrderBy orderBy : orderBys) { - orderBySql.append(orderBy.toSql(queryTables, dialect)); + orderBySql.append(orderBy.toSql(allTables, dialect)); if (index != orderBys.size() - 1) { orderBySql.append(DELIMITER); } diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LimitOffsetProcessorTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LimitOffsetProcessorTester.java new file mode 100644 index 00000000..452d5a71 --- /dev/null +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LimitOffsetProcessorTester.java @@ -0,0 +1,38 @@ +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; +import org.junit.Assert; +import org.junit.Test; + +import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; +import static com.mybatisflex.coretest.table.ArticleTableDef.ARTICLE; + +public class LimitOffsetProcessorTester { + + @Test + public void testSqlServer2005() { + IDialect dialect = new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcessor.SQLSERVER_2005); + QueryWrapper oneTableQueryWrapper = QueryWrapper.create() + .select() + .from(ACCOUNT) + .orderBy(ACCOUNT.ID.desc()).limit(10, 10); + String sql = dialect.forSelectByQuery(oneTableQueryWrapper); + System.out.println(sql); + Assert.assertEquals("WITH temp_datas AS(SELECT ROW_NUMBER() OVER ( ORDER BY [id] DESC) as __rn, * FROM [tb_account]) SELECT * FROM temp_datas WHERE __rn BETWEEN 11 AND 20 ORDER BY __rn", sql); + + QueryWrapper twoTablequeryWrapper = QueryWrapper.create() + .select() + .from(ACCOUNT) + .leftJoin(ARTICLE).on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID)) + .orderBy(ACCOUNT.ID.desc()).limit(10, 10); + sql = dialect.forSelectByQuery(twoTablequeryWrapper); + System.out.println(sql); + Assert.assertEquals("WITH temp_datas AS(" + + "SELECT ROW_NUMBER() OVER ( ORDER BY [tb_account].[id] DESC) as __rn, * FROM [tb_account] LEFT JOIN [tb_article] ON [tb_article].[account_id] = [tb_account].[id]" + + ") SELECT * FROM temp_datas WHERE __rn BETWEEN 11 AND 20 ORDER BY __rn", sql); + } +}