【问题标题】:Count the number of groups in HQL Query?计算 HQL 查询中的组数?
【发布时间】:2015-09-28 16:36:21
【问题描述】:

我有以下 HQL 查询:

select c.device from Choice c 
group by c.device

现在我想计算结果中的组数,而不是每组的设备数。

我试过了:

select count(distinct c.device) from Choice c 
    group by c.device

但这给出了每组中不同设备的数量。这类似于[2,3,4]。但我需要2+3+4

如何获取 HQL 的组数?

【问题讨论】:

  • 看起来sum 可能会做你想做的事?
  • 另外,您是否需要对组进行计数,根据您的样本为3,或者您是否需要对所有组进行总和,即9?跨度>
  • 不,绝对不是总和。
  • 类似于stackoverflow.com/questions/9184135/…。当天晚些时候,但可能会帮助其他人 - 描述 HQL 方式的评论。一些我们如何基于分组总和得到两个不同的查询:这个SomeClass.executeQuery("select count(distinct subClass.someThing) "+query+grpStmt,whereParams).sum()和这个:SomeClass.executeQuery("select new map (mainClass.id as id)"+query+grpStmt,whereParams)?.size()它们都产生相同的结果但是发生不同的查找.sum()比后者快得多.size()

标签: grails hql


【解决方案1】:

您必须进行计数,这在 HQL 中不受支持。

SQL

在 SQL 中它看起来像这样:

select count(innerQuery.counted)
from (select count(d.id) as counted
      from Choice c inner join Device d
      on c.device_id = d.id
      group by d.id) as innerQuery

在上面的示例中,外部查询从返回组的子查询中进行选择。然后外部查询对生成的counted 列进行计数。

HQL

另一种方法是进行计数,然后获取列表的大小。

Choice.executeQuery('select count(c.device) from Choice c group by c.device').size()

存在性能损失,因为计数是在客户端完成的。

【讨论】:

  • 我认为你必须做 .size() 而不是 .sum()?
  • size() 会为您提供组数,因为每条记录代表一个分组。 sum() 会给你设备的总数。例如,assert [2,3,4].size() == 3assert [2,3,4].sum() == 9
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多