TypeORM中countBy与查询构建器计数差异及非去重计数方法咨询
TypeORM中实现非去重全量计数的方法
当你的实体使用联合主键时,countBy({})和createQueryBuilder().getCount()的结果差异源于TypeORM的默认行为:前者会生成COUNT(DISTINCT 主键字段1, 主键字段2,...)的SQL进行去重统计,而后者默认使用COUNT(*)统计所有行。
如果想要实现类似countBy的简洁写法同时得到非去重的全量计数,可以通过以下方式:
方法1:无过滤条件的全量计数
直接用查询构建器指定统计所有行:
const generatedBlockCount = await blockRepository .createQueryBuilder(Block.name) .select("COUNT(*)", "total") .getRawOne() .then(result => parseInt(result.total));
方法2:带过滤条件的非去重计数(替代countBy带条件场景)
如果需要添加类似countBy的过滤条件,只需在查询构建器中加入where子句:
// 示例:统计status为active的所有行 const generatedBlockCount = await blockRepository .createQueryBuilder(Block.name) .where({ status: "active" }) .select("COUNT(*)", "total") .getRawOne() .then(result => parseInt(result.total));
补充说明
TypeORM的countBy和count方法目前没有直接的配置项关闭联合主键的去重逻辑,因此使用查询构建器手动指定COUNT(*)是最直接的解决方案。这种方式既保留了条件过滤的灵活性,又能准确统计所有行的数量。
内容的提问来源于stack exchange,提问作者juztcode
相关产品推荐
相关产品推荐

