如何在NestJS中使用TypeORM Repository实现GroupBy?
在TypeORM Repository模式中实现GroupBy查询
方法1:通过find/findAndCount配置项直接实现
TypeORM的Repository核心方法(如find、findAndCount)的选项参数支持groupBy字段,搭配select指定查询字段(含聚合函数)即可实现分组,示例如下:
假设你有Order实体,需按userId分组统计每个用户的订单数量:
import { getRepository } from "typeorm"; import { Order } from "./entities/Order"; const orderRepo = getRepository(Order); // 分组查询示例 const userOrderStats = await orderRepo.find({ select: [ "userId", "id", // 注意:非聚合字段必须加入groupBy数组 () => "COUNT(id) as orderCount" // 聚合函数+别名,用于后续读取结果 ], groupBy: ["userId", "id"], }); // 获取统计结果 console.log(userOrderStats[0].orderCount);
方法2:通过Repository创建QueryBuilder(适配复杂场景)
如果需要结合条件筛选、多表关联等复杂逻辑,可直接调用Repository的createQueryBuilder方法——这依然属于Repository模式范畴,只是借助QueryBuilder的语法实现分组:
const userOrderStats = await orderRepo .createQueryBuilder("order") .select("order.userId", "userId") .addSelect("COUNT(order.id)", "orderCount") .groupBy("order.userId") .where("order.status = :status", { status: "completed" }) // 可选:添加筛选条件 .getRawMany(); // 用getRawMany获取带别名的聚合结果
注意事项
- 使用
find方法的groupBy时,所有非聚合字段必须包含在groupBy数组中,否则会触发数据库语法错误。 - 聚合函数的结果需通过别名获取,可直接访问属性(find方式)或用
getRawMany(QueryBuilder方式)。 - 低版本TypeORM可能对
find选项中的groupBy支持不完善,此时优先使用createQueryBuilder方案。
内容的提问来源于stack exchange,提问作者Rhythm
相关产品推荐
相关产品推荐

