【问题标题】:Count(*) inside another count(*)Count(*) 在另一个 count(*) 中
【发布时间】:2016-02-21 12:26:40
【问题描述】:

首先,很抱歉,如果这个问题已经被问过,但我在搜索时找不到任何东西。

我是 Hibernate 的新手,我不确定这是否可以完成,但我正在尝试将以下查询从 SQL 转换为 Hibernate:

Select count(*) from (
  Select count(*) 
  from table
  where field1 in (...)
  Group by field1, field2);

现在,我知道我可以获取第二个查询的列表并检查其大小,但我想使用 uniqueResult() 方法来执行此操作,因为它更有效。

关于如何做到这一点的任何想法? 提前致谢!

编辑 1:对不起,我忘了提到我试图用 HQL 来做这件事。

【问题讨论】:

  • 可以通过更简单的查询来完成:select count(distinct concat(field1,field2)) from table where field1 in(...)
  • count 返回一个数字,所以 count(count) 始终为 1,不是吗?
  • @RC。不,他正在按 field1,field2 进行分组计数 .. 所以它本质上类似于 count (select distinct field1,field2) ..
  • 对不起,我忘了说我正在尝试在 HQL 中执行此操作。

标签: java sql hibernate hql


【解决方案1】:

from 子句中的休眠 does not support 子查询。您可以通过重写查询来解决此问题,以计算 @sagi 在 cmets 中已建议的 field1field2 的不同连接,或者,如果您发现连接成本太高,则类似于:

select count(*) from table
where id in
  (select max(id) from table
   where field1 in (...)
   group by field1, field2);

【讨论】:

  • 太糟糕了,您不能将子查询放在 from 子句中。我想我可以通过获取返回的列表的大小或使用本机 SQL 查询来解决这个问题。
  • 是的,它是 Hibernate 中最受欢迎的功能之一。希望它会尽快实施。
【解决方案2】:

如果你能这样做就好了:

Select count(distinct field1, field2) 
from table
where field1 in (...)

但我认为这在 Hibernate 中不起作用。一种解决方法是使用分隔符连接值(正如 Sagi 在 cmets 中提到的):

Select count(distinct field1 || ':' || field2) 
from table
where field1 in (...);

请注意:此版本对 NULL 值的处理方式与您的原始查询不同。这很容易处理,但它使逻辑稍微复杂一些。

【讨论】:

  • 两个答案都和我的 cmets 一样:S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2015-06-01
相关资源
最近更新 更多