diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java index 35f16ae5..464a2997 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java @@ -2,6 +2,8 @@ package com.mybatisflex.test; import com.mybatisflex.core.dialect.CommonsDialectImpl; import com.mybatisflex.core.dialect.IDialect; +import com.mybatisflex.core.dialect.KeywordWrap; +import com.mybatisflex.core.dialect.LimitOffsetProcesser; import com.mybatisflex.core.querywrapper.CPI; import com.mybatisflex.core.querywrapper.QueryWrapper; import com.mybatisflex.core.table.TableInfo; @@ -195,6 +197,47 @@ public class AccountSqlTester { } + @Test + public void testLimitOffset() { + + QueryWrapper queryWrapper = QueryWrapper.create() + .select() + .from(ACCOUNT) + .orderBy(ACCOUNT.ID.desc()) + .limit(10) + .offset(20); + + IDialect dialect1 = new CommonsDialectImpl(); + String sql1 = dialect1.buildSelectSql(queryWrapper); + System.out.println(sql1); + + IDialect dialect2 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.ORACLE); + String sql2 = dialect2.buildSelectSql(queryWrapper); + System.out.println(sql2); + + IDialect dialect3 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.DB2); + String sql3 = dialect3.buildSelectSql(queryWrapper); + System.out.println(sql3); + + IDialect dialect4 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.POSTGRESQL); + String sql4 = dialect4.buildSelectSql(queryWrapper); + System.out.println(sql4); + + IDialect dialect5 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.INFORMIX); + String sql5 = dialect5.buildSelectSql(queryWrapper); + System.out.println(sql5); + + IDialect dialect6 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.SYBASE); + String sql6 = dialect6.buildSelectSql(queryWrapper); + System.out.println(sql6); + + + IDialect dialect7 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.FIREBIRD); + String sql7 = dialect7.buildSelectSql(queryWrapper); + System.out.println(sql7); + } + + @Test public void testrSelectLimitSql() { QueryWrapper queryWrapper = QueryWrapper.create() diff --git a/readme.md b/readme.md index 1e3a1b95..a2f3857f 100644 --- a/readme.md +++ b/readme.md @@ -269,8 +269,44 @@ QueryWrapper queryWrapper = QueryWrapper.create() // SELECT * FROM tb_account // LEFT JOIN tb_article // ON tb_account.id = tb_article.account_id -// WHERE tb_account.age >= ? +// WHERE tb_account.age >= ? +``` + +### limit... offset + +```java +QueryWrapper queryWrapper = QueryWrapper.create() + .select() + .from(ACCOUNT) + .orderBy(ACCOUNT.ID.desc()) + .limit(10) + .offset(20); + +// MySql: +// SELECT * FROM `tb_account` ORDER BY `id` DESC LIMIT 20, 10 + +// postgreSQL: +// SELECT * FROM "tb_account" ORDER BY "id" DESC LIMIT 20 OFFSET 10 + +// informix: +// SELECT SKIP 20 FIRST 10 * FROM "tb_account" ORDER BY "id" DESC + +// oracle: +// SELECT * FROM (SELECT TEMP_DATAS.*, +// ROWNUM RN FROM ( +// SELECT * FROM "tb_account" ORDER BY "id" DESC) +// TEMP_DATAS WHERE ROWNUM <=30) +// WHERE RN >20 + +// db2: +// SELECT * FROM "tb_account" ORDER BY "id" DESC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY + +// sybase: +// SELECT TOP 10 START AT 30 * FROM "tb_account" ORDER BY "id" DESC + +// firebird: +// SELECT * FROM "tb_account" ORDER BY "id" DESC ROWS 20 TO 30 ``` ### Questions? diff --git a/readme_zh.md b/readme_zh.md index ad383847..beb6412b 100644 --- a/readme_zh.md +++ b/readme_zh.md @@ -309,6 +309,43 @@ QueryWrapper queryWrapper=QueryWrapper.create() // WHERE tb_account.age >= ? ``` + +### limit... offset + +```java +QueryWrapper queryWrapper = QueryWrapper.create() + .select() + .from(ACCOUNT) + .orderBy(ACCOUNT.ID.desc()) + .limit(10) + .offset(20); + +// MySql: +// SELECT * FROM `tb_account` ORDER BY `id` DESC LIMIT 20, 10 + +// postgreSQL: +// SELECT * FROM "tb_account" ORDER BY "id" DESC LIMIT 20 OFFSET 10 + +// informix: +// SELECT SKIP 20 FIRST 10 * FROM "tb_account" ORDER BY "id" DESC + +// oracle: +// SELECT * FROM (SELECT TEMP_DATAS.*, +// ROWNUM RN FROM ( +// SELECT * FROM "tb_account" ORDER BY "id" DESC) +// TEMP_DATAS WHERE ROWNUM <=30) +// WHERE RN >20 + +// db2: +// SELECT * FROM "tb_account" ORDER BY "id" DESC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY + +// sybase: +// SELECT TOP 10 START AT 30 * FROM "tb_account" ORDER BY "id" DESC + +// firebird: +// SELECT * FROM "tb_account" ORDER BY "id" DESC ROWS 20 TO 30 +``` + ### 存在疑问? **疑问 1:QueryWrapper 是否可以在分布式项目中通过 RPC 传输?**