浏览代码

mysql pg 分页动态参数优化

miemie 4 年之前
父节点
当前提交
971fc4d561

+ 5 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/IPage.java

@@ -73,7 +73,11 @@ public interface IPage<T> extends Serializable {
      * 计算当前分页偏移量
      */
     default long offset() {
-        return getCurrent() > 0 ? (getCurrent() - 1) * getSize() : 0;
+        long current = getCurrent();
+        if (current == 0L) {
+            return 0L;
+        }
+        return (current - 1) * getSize();
     }
 
     /**

+ 4 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectModel.java

@@ -77,6 +77,10 @@ public class DialectModel {
         this(dialectSql, 0, 0);
     }
 
+    public DialectModel(String dialectSql, long firstParam) {
+        this(dialectSql, firstParam, 0);
+    }
+
     public DialectModel(String dialectSql, long firstParam, long secondParam) {
         this.dialectSql = dialectSql;
         this.firstParam = firstParam;

+ 7 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/MySqlDialect.java

@@ -28,7 +28,12 @@ public class MySqlDialect implements IDialect {
 
     @Override
     public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
-        String sql = originalSql + " LIMIT " + FIRST_MARK + StringPool.COMMA + SECOND_MARK;
-        return new DialectModel(sql, offset, limit).setConsumerChain();
+        if (offset != 0L) {
+            String sql = originalSql + " LIMIT " + FIRST_MARK + StringPool.COMMA + SECOND_MARK;
+            return new DialectModel(sql, offset, limit).setConsumerChain();
+        } else {
+            String sql = originalSql + " LIMIT " + FIRST_MARK;
+            return new DialectModel(sql, limit).setConsumer(true);
+        }
     }
 }

+ 7 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/PostgreDialect.java

@@ -27,7 +27,12 @@ public class PostgreDialect implements IDialect {
 
     @Override
     public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
-        String sql = originalSql + " LIMIT " + FIRST_MARK + " OFFSET " + SECOND_MARK;
-        return new DialectModel(sql, limit, offset).setConsumerChain();
+        if (offset != 0L) {
+            String sql = originalSql + " LIMIT " + FIRST_MARK + " OFFSET " + SECOND_MARK;
+            return new DialectModel(sql, limit, offset).setConsumerChain();
+        } else {
+            String sql = originalSql + " LIMIT " + FIRST_MARK;
+            return new DialectModel(sql, limit).setConsumer(true);
+        }
     }
 }