如何在TypeORM中使用Repository的find方法结合MS SQL Server实现GROUP BY操作?
TypeORM 实现 GROUP BY 查询(MS SQL Server)
TypeORM的find()方法(含findMany())不支持直接配置GROUP BY,这类复杂分组查询得用QueryBuilder来实现,以下是具体示例和关键说明:
基础分组查询示例
假设你要按workshop字段分组,统计每个车间的总产量(以productionQty字段求和为例):
const groupedProduction = await this.dailyProductionRepository .createQueryBuilder('dp') // 'dp'是表的别名,可自定义 .select('dp.workshop', 'workshop') // 指定分组字段,别名用于结果映射 .addSelect('SUM(dp.productionQty)', 'totalProduction') // 聚合函数,计算分组后的总和 .groupBy('dp.workshop') // 指定分组字段 .getRawMany(); // 获取原始键值对结果,因为返回的是自定义结构而非实体实例
如果只是需要分组后的唯一字段值(比如去重的车间列表):
const uniqueWorkshops = await this.dailyProductionRepository .createQueryBuilder('dp') .select('dp.workshop', 'workshop') .groupBy('dp.workshop') .getRawMany();
带筛选条件的分组查询
可以用having对分组后的结果进行筛选(区别于where对原始数据的筛选),比如只保留总产量超过1000的车间:
const filteredGroups = await this.dailyProductionRepository .createQueryBuilder('dp') .select('dp.workshop', 'workshop') .addSelect('SUM(dp.productionQty)', 'totalProduction') .groupBy('dp.workshop') .having('SUM(dp.productionQty) > :minAmount', { minAmount: 1000 }) // 筛选分组结果 .orderBy('totalProduction', 'DESC') // 按总产量降序排列 .getRawMany();
关键注意事项
- MS SQL Server要求:SELECT语句中的非聚合字段必须全部出现在GROUP BY子句中,否则会触发语法错误。
- 结果获取:分组查询返回的是自定义结构而非实体类实例,所以用
getRawMany();如果你的分组逻辑恰好返回符合实体结构的数据,也可以用getMany(),但这种场景很少见。 FindManyOptions局限性:该配置对象没有groupBy参数,因此无法通过find()方法实现分组查询,必须使用QueryBuilder。
内容的提问来源于stack exchange,提问作者Sufail Kalathil
相关产品推荐
相关产品推荐

