From 3a82710e22b2415593ec0be1a2e13944c254286c Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Tue, 4 Jul 2023 16:37:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20selectCountByQ?= =?UTF-8?q?uery=20=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/core/BaseMapper.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) 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 3f26d1ec..7f79d93f 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 @@ -20,10 +20,7 @@ import com.mybatisflex.core.field.FieldQueryBuilder; import com.mybatisflex.core.mybatis.MappedStatementTypes; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.provider.EntitySqlProvider; -import com.mybatisflex.core.query.CPI; -import com.mybatisflex.core.query.QueryColumn; -import com.mybatisflex.core.query.QueryCondition; -import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.query.*; import com.mybatisflex.core.table.TableInfo; import com.mybatisflex.core.table.TableInfoFactory; import com.mybatisflex.core.util.*; @@ -641,10 +638,27 @@ public interface BaseMapper { default long selectCountByQuery(QueryWrapper queryWrapper) { List selectColumns = CPI.getSelectColumns(queryWrapper); try { + List objects; if (CollectionUtil.isEmpty(selectColumns)) { + // 未设置 COUNT(...) 列,默认使用 COUNT(*) 查询 queryWrapper.select(count()); + objects = selectObjectListByQuery(queryWrapper); + } else if (selectColumns.get(0) instanceof CountQueryColumn) { + // 自定义 COUNT 函数,COUNT 函数必须在第一列 + // 可以使用 COUNT(1)、COUNT(列名) 代替默认的 COUNT(*) + objects = selectObjectListByQuery(queryWrapper); + } else { + // 查询列中的第一列不是 COUNT 函数 + if (MapperUtil.hasDistinct(selectColumns)) { + // 查询列中包含 DISTINCT 去重 + // 使用子查询 SELECT COUNT(*) FROM (SELECT DISTINCT ...) AS `t` + objects = selectObjectListByQuery(MapperUtil.rawCountQueryWrapper(queryWrapper)); + } else { + // 使用 COUNT(*) 替换所有的查询列 + queryWrapper.select(count()); + objects = selectObjectListByQuery(queryWrapper); + } } - List objects = selectObjectListByQuery(queryWrapper); return MapperUtil.getLongNumber(objects); } finally { //fixed https://github.com/mybatis-flex/mybatis-flex/issues/49