Browse Source

分页count优化

miemie 4 years ago
parent
commit
979fa831e4

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

@@ -302,8 +302,15 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
                         canRemoveJoin = false;
                         break;
                     }
-                    Table table = (Table) join.getRightItem();
-                    String str = Optional.ofNullable(table.getAlias()).map(Alias::getName).orElse(table.getName()) + StringPool.DOT;
+                    FromItem rightItem = join.getRightItem();
+                    String str = "";
+                    if (rightItem instanceof Table) {
+                        Table table = (Table) rightItem;
+                        str = Optional.ofNullable(table.getAlias()).map(Alias::getName).orElse(table.getName()) + StringPool.DOT;
+                    } else if (rightItem instanceof SubSelect) {
+                        SubSelect subSelect = (SubSelect) rightItem;
+                        str = subSelect.getAlias().getName() + StringPool.DOT;
+                    }
                     // 不区分大小写
                     str = str.toLowerCase();
                     String onExpressionS = join.getOnExpression().toString();
@@ -320,11 +327,13 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
             // 优化 SQL
             plainSelect.setSelectItems(COUNT_SELECT_ITEM);
             return select.toString();
-        } catch (Throwable e) {
+        } catch (JSQLParserException e) {
             // 无法优化使用原 SQL
             logger.warn("optimize this sql to a count sql has exception, sql:\"" + sql + "\", exception:\n" + e.getCause());
-            return lowLevelCountSql(sql);
+        } catch (Exception e) {
+            logger.warn("optimize this sql to a count sql has error, sql:\"" + sql + "\", exception:\n" + e);
         }
+        return lowLevelCountSql(sql);
     }
 
     /**
@@ -367,8 +376,10 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
             }
         } catch (JSQLParserException e) {
             logger.warn("failed to concat orderBy from IPage, exception:\n" + e.getCause());
-            return originalSql;
+        } catch (Exception e) {
+            logger.warn("failed to concat orderBy from IPage, exception:\n" + e);
         }
+        return originalSql;
     }
 
     protected List<OrderByElement> addOrderByElements(List<OrderItem> orderList, List<OrderByElement> orderByElements) {

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

@@ -75,6 +75,16 @@ class PaginationInnerInterceptorTest {
             "SELECT COUNT(1) FROM (SELECT * FROM record_1 WHERE id = ? GROUP BY date(date_time)) TOTAL");
     }
 
+    @Test
+    void leftJoinSelectCount() {
+        assertsCountSql("select r.id, r.name, r.phone,rlr.total_top_up from reseller r " +
+                "left join (select ral.reseller_id, sum(ral.top_up_money) as total_top_up, sum(ral.acquire_money) as total_acquire " +
+                "from reseller_acquire_log ral " +
+                "group by ral.reseller_id) rlr on r.id = rlr.reseller_id " +
+                "order by r.created_at desc",
+            "SELECT COUNT(1) FROM reseller r");
+    }
+
     void assertsCountSql(String sql, String targetSql) {
         assertThat(interceptor.autoCountSql(true, sql)).isEqualTo(targetSql);
     }