ソースを参照

FIX https://github.com/baomidou/mybatis-plus/issues/4426

VampireAchao 3 年 前
コミット
86bd901135

+ 28 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/PageResultHandler.java

@@ -0,0 +1,28 @@
+package com.baomidou.mybatisplus.extension.plugins.handler;
+
+import org.apache.ibatis.session.ResultContext;
+import org.apache.ibatis.session.ResultHandler;
+
+import lombok.Data;
+
+/**
+ * 用于分页时传入自定义ResultHandler场景
+ *
+ * @author VampireAchao
+ * @since 2022-04-19
+ */
+@Data
+public abstract class PageResultHandler<T> implements ResultHandler<T> {
+
+    /**
+     * 分页时返回count条数
+     */
+    protected long count;
+
+    @Override
+    public void handleResult(ResultContext<? extends T> resultContext) {
+        if (resultContext.getResultObject() instanceof Long) {
+            this.count = Long.parseLong(resultContext.getResultObject().toString());
+        }
+    }
+}

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

@@ -15,16 +15,45 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.inner;
 
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import org.apache.ibatis.cache.CacheKey;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.mapping.ResultMap;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
-import com.baomidou.mybatisplus.core.toolkit.*;
+import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.ParameterUtils;
+import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.handler.PageResultHandler;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 import com.baomidou.mybatisplus.extension.toolkit.PropertyMapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
+
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import net.sf.jsqlparser.JSQLParserException;
@@ -33,23 +62,19 @@ import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
-import net.sf.jsqlparser.statement.select.*;
-import org.apache.ibatis.cache.CacheKey;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
-import org.apache.ibatis.mapping.BoundSql;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.ParameterMapping;
-import org.apache.ibatis.mapping.ResultMap;
-import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.session.ResultHandler;
-import org.apache.ibatis.session.RowBounds;
-
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
+import net.sf.jsqlparser.statement.select.Distinct;
+import net.sf.jsqlparser.statement.select.FromItem;
+import net.sf.jsqlparser.statement.select.GroupByElement;
+import net.sf.jsqlparser.statement.select.Join;
+import net.sf.jsqlparser.statement.select.OrderByElement;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.select.SelectBody;
+import net.sf.jsqlparser.statement.select.SelectExpressionItem;
+import net.sf.jsqlparser.statement.select.SelectItem;
+import net.sf.jsqlparser.statement.select.SetOperationList;
+import net.sf.jsqlparser.statement.select.SubSelect;
+import net.sf.jsqlparser.statement.select.WithItem;
 
 /**
  * 分页拦截器
@@ -134,6 +159,10 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
         CacheKey cacheKey = executor.createCacheKey(countMs, parameter, rowBounds, countSql);
         List<Object> result = executor.query(countMs, parameter, rowBounds, resultHandler, cacheKey, countSql);
         long total = 0;
+        if (resultHandler instanceof PageResultHandler) {
+            // FIX https://github.com/baomidou/mybatis-plus/issues/4426
+            total = ((PageResultHandler) resultHandler).getCount();
+        }
         if (CollectionUtils.isNotEmpty(result)) {
             // 个别数据库 count 没数据不会返回 0
             Object o = result.get(0);
@@ -273,11 +302,8 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
             List<OrderByElement> orderBy = plainSelect.getOrderByElements();
 
             if (CollectionUtils.isNotEmpty(orderBy)) {
-                boolean canClean = true;
-                if (groupBy != null) {
-                    // 包含groupBy 不去除orderBy
-                    canClean = false;
-                }
+                boolean canClean = groupBy == null;
+                // 包含groupBy 不去除orderBy
                 if (canClean) {
                     for (OrderByElement order : orderBy) {
                         // order by 里带参数,不去除order by