Forráskód Böngészése

Ipage#optimizeJoinOfCountSql 属性联合 分页插件的 optimizeJoin 属性联合控制是否优化 countsql的join 条件

miemie 3 éve
szülő
commit
44e459b0f5

+ 11 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/IPage.java

@@ -45,6 +45,17 @@ public interface IPage<T> extends Serializable {
         return true;
     }
 
+    /**
+     * {@link com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#isOptimizeJoin()}
+     * 两个参数都为 true 才会进行sql处理
+     *
+     * @return true 是 / false 否
+     * @since 3.4.4 @2021-09-13
+     */
+    default boolean optimizeJoinOfCountSql() {
+        return true;
+    }
+
     /**
      * 进行 count 查询 【 默认: true 】
      *

+ 6 - 6
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java

@@ -131,7 +131,7 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
             countSql = countMs.getBoundSql(parameter);
         } else {
             countMs = buildAutoCountMappedStatement(ms);
-            String countSqlStr = autoCountSql(page.optimizeCountSql(), boundSql.getSql());
+            String countSqlStr = autoCountSql(page, boundSql.getSql());
             PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
             countSql = new BoundSql(countMs.getConfiguration(), countSqlStr, mpBoundSql.parameterMappings(), parameter);
             PluginUtils.setAdditionalParameter(countSql, mpBoundSql.additionalParameters());
@@ -258,12 +258,12 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
     /**
      * 获取自动优化的 countSql
      *
-     * @param optimizeCountSql 是否进行优化
-     * @param sql              sql
+     * @param page 参数
+     * @param sql  sql
      * @return countSql
      */
-    protected String autoCountSql(boolean optimizeCountSql, String sql) {
-        if (!optimizeCountSql) {
+    protected String autoCountSql(IPage<?> page, String sql) {
+        if (!page.optimizeCountSql()) {
             return lowLevelCountSql(sql);
         }
         try {
@@ -304,7 +304,7 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
                 return lowLevelCountSql(select.toString());
             }
             // 包含 join 连表,进行判断是否移除 join 连表
-            if (optimizeJoin) {
+            if (optimizeJoin && page.optimizeJoinOfCountSql()) {
                 List<Join> joins = plainSelect.getJoins();
                 if (CollectionUtils.isNotEmpty(joins)) {
                     boolean canRemoveJoin = true;

+ 17 - 7
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/Page.java

@@ -68,6 +68,11 @@ public class Page<T> implements IPage<T> {
      * 是否进行 count 查询
      */
     protected boolean searchCount = true;
+    /**
+     * {@link #optimizeJoinOfCountSql()}
+     */
+    @Setter
+    protected boolean optimizeJoinOfCountSql = true;
     /**
      * countId
      */
@@ -242,12 +247,13 @@ public class Page<T> implements IPage<T> {
         return optimizeCountSql;
     }
 
+    public static <T> Page<T> of(long current, long size, long total, boolean searchCount) {
+        return new Page<>(current, size, total, searchCount);
+    }
+
     @Override
-    public boolean searchCount() {
-        if (total < 0) {
-            return false;
-        }
-        return searchCount;
+    public boolean optimizeJoinOfCountSql() {
+        return optimizeJoinOfCountSql;
     }
 
     public Page<T> setSearchCount(boolean searchCount) {
@@ -279,8 +285,12 @@ public class Page<T> implements IPage<T> {
         return of(current, size, 0, searchCount);
     }
 
-    public static <T> Page<T> of(long current, long size, long total, boolean searchCount) {
-        return new Page(current, size, total, searchCount);
+    @Override
+    public boolean searchCount() {
+        if (total < 0) {
+            return false;
+        }
+        return searchCount;
     }
 
     /**

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

@@ -26,6 +26,7 @@ import java.util.List;
  * @since 2021-05-20
  */
 public class PageDTO<T> extends Page<T> {
+    private static final long serialVersionUID = 1L;
 
     public PageDTO() {
     }
@@ -66,6 +67,10 @@ public class PageDTO<T> extends Page<T> {
         return this.optimizeCountSql;
     }
 
+    public boolean isOptimizeJoinOfCountSql() {
+        return this.optimizeJoinOfCountSql;
+    }
+
     @Override
     public boolean isSearchCount() {
         return this.searchCount;

+ 2 - 1
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptorTest.java

@@ -1,6 +1,7 @@
 package com.baomidou.mybatisplus.extension.plugins.inner;
 
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
@@ -94,7 +95,7 @@ class PaginationInnerInterceptorTest {
     }
 
     void assertsCountSql(String sql, String targetSql) {
-        assertThat(interceptor.autoCountSql(true, sql)).isEqualTo(targetSql);
+        assertThat(interceptor.autoCountSql(new Page<>(), sql)).isEqualTo(targetSql);
     }
 
     void assertsConcatOrderBy(String sql, String targetSql, OrderItem... orderItems) {