From e45df191df387a9f51891fbcb8c2e44211dc8e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Mon, 22 May 2023 08:07:33 +0800 Subject: [PATCH] optimize paginate method --- .../java/com/mybatisflex/core/BaseMapper.java | 17 ++++++++++++++++- .../com/mybatisflex/core/row/RowMapper.java | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java index 1548878b..d1297771 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java @@ -575,16 +575,25 @@ public interface BaseMapper { default Page paginateAs(Page page, QueryWrapper queryWrapper, Class asType) { List selectColumns = CPI.getSelectColumns(queryWrapper); + List orderBys = CPI.getOrderBys(queryWrapper); + List joins = CPI.getJoins(queryWrapper); boolean removedJoins = true; - // 只有 totalRow 小于 0 的时候才会去查询总量 // 这样方便用户做总数缓存,而非每次都要去查询总量 // 一般的分页场景中,只有第一页的时候有必要去查询总量,第二页以后是不需要的 if (page.getTotalRow() < 0) { + //移除 select CPI.setSelectColumns(queryWrapper, Collections.singletonList(count().as("total"))); + //移除 OrderBy + if (CollectionUtil.isNotEmpty(orderBys)) { + CPI.setOrderBys(queryWrapper, null); + } + + + //移除 left join if (joins != null && !joins.isEmpty()) { for (Join join : joins) { if (!Join.TYPE_LEFT.equals(CPI.getJoinType(join))) { @@ -615,6 +624,7 @@ public interface BaseMapper { CPI.setJoins(queryWrapper, null); } + long count = selectCountByQuery(queryWrapper); page.setTotalRow(count); } @@ -626,6 +636,11 @@ public interface BaseMapper { //重置 selectColumns CPI.setSelectColumns(queryWrapper, selectColumns); + //重置 orderBys + if (CollectionUtil.isNotEmpty(orderBys)) { + CPI.setOrderBys(queryWrapper, orderBys); + } + //重置 join if (removedJoins) { CPI.setJoins(queryWrapper, joins); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/RowMapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/RowMapper.java index 78b2db76..ea85985f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/RowMapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/RowMapper.java @@ -404,6 +404,9 @@ public interface RowMapper { CPI.setFromIfNecessary(queryWrapper, tableName); List selectColumns = CPI.getSelectColumns(queryWrapper); + + List orderBys = CPI.getOrderBys(queryWrapper); + List joins = CPI.getJoins(queryWrapper); boolean removedJoins = true; @@ -412,8 +415,15 @@ public interface RowMapper { // 一般的分页场景中,只有第一页的时候有必要去查询总量,第二页以后是不需要的 if (page.getTotalRow() < 0) { + //移除 seelct CPI.setSelectColumns(queryWrapper, Collections.singletonList(count().as("total"))); + //移除 OrderBy + if (CollectionUtil.isNotEmpty(orderBys)) { + CPI.setOrderBys(queryWrapper, null); + } + + //移除 left join if (joins != null && !joins.isEmpty()) { for (Join join : joins) { if (!Join.TYPE_LEFT.equals(CPI.getJoinType(join))) { @@ -455,6 +465,11 @@ public interface RowMapper { //重置 selectColumns CPI.setSelectColumns(queryWrapper, selectColumns); + //重置 orderBys + if (CollectionUtil.isNotEmpty(orderBys)) { + CPI.setOrderBys(queryWrapper, orderBys); + } + //重置 join if (removedJoins) { CPI.setJoins(queryWrapper, joins);