如何使用QueryDSL基于Group By获取分组后的记录行数
解决方案:统计JOOQ分组查询后的结果行数
针对你在JOOQ 5.0.0版本中需要统计分组后结果总数的需求,提供两种可行方案:
方案一:将分组查询作为子查询统计行数
把原分组查询包装成派生表,外层通过count(*)统计行数,这是最直观的方式:
// 先定义原分组查询 Select<?> groupedQuery = query.select(t1.name, t1.type, t2.name, t2.type, quantity, sum) .from(t1) .innerJoin(t2).on(t1.t2.id.eq(t2.id)) .where(predicate) .groupBy(t1.name, t1.type, t2.name, t2.type); // 外层统计分组后的行数 int groupCount = dslContext.select(count()) .from(groupedQuery.as("grouped_data")) // 必须给子查询起别名 .fetchOneInto(Integer.class);
注:JOOQ要求派生表必须指定别名,否则会抛出语法错误,这可能是你之前尝试子查询失败的原因。
方案二:使用多字段COUNT DISTINCT
由于分组的唯一性由groupBy后的所有字段组合决定,直接统计这些字段的唯一组合数即可得到分组后的行数:
int groupCount = dslContext.select(countDistinct(t1.name, t1.type, t2.name, t2.type)) .from(t1) .innerJoin(t2).on(t1.t2.id.eq(t2.id)) .where(predicate) .fetchOneInto(Integer.class);
注:该方案依赖数据库对多字段DISTINCT的支持(主流数据库如MySQL 8.0+、PostgreSQL、Oracle均支持),如果之前尝试countDistinct失败,大概率是只传入了部分分组字段,而非全部组合字段。
内容的提问来源于stack exchange,提问作者AP Game
相关产品推荐
相关产品推荐

