【问题标题】:HQL - select count from selectHQL - 从选择中选择计数
【发布时间】:2012-03-20 12:13:47
【问题描述】:

我希望能够计算在另一个查询中返回的记录数量。使用 SQL 很简单:

select count (*) 
from  (
  select count(first_name) 
  from users 
  group by first_name) as temp

有谁知道如何使用 HQL 做到这一点?

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    我认为这是不可能的通用方式。 HQL 确实——据我所知——不支持 from 子句中的子查询。 (可以肯定的是,试试吧。有时还有隐藏的功能……)

    在这种情况下,查询将是:

    select count(distinct first_name)
    from users 
    

    似乎无法计算多个不同的列。

    有一个feature for QueryOver(我不知道它是否存在以及在Java中如何调用它)。

    如果你迫切需要HQL,你可以写一个这样的方法并发送到社区......

    【讨论】:

      【解决方案2】:
      select count(*) from
      (
         select AUTO_ID_CUSTOMER, sum(UNIT_QTY*UNIT_PRICE)
         from V_TRANSACTIONS
         where INV_DATE > '01/01/2006'
         group by AUTO_ID_CUSTOMER
         having sum(UNIT_QTY*UNIT_PRICE) < 100000
      )
      

      【讨论】:

      • 对上述问题的回答很奇怪。
      • 给我更多关于 HQL 的描述?
      【解决方案3】:

      我希望它会对某人有所帮助。这是一个有效的 HQL/SQL 查询:

      SELECT COUNT(*) FROM users AS u WHERE u.id IN 
        (SELECT u2.id FROM users AS u2 GROUP BY u2.first_name);
      

      选择分组行的ID,然后统计该列表中具有id的行。

      UPD:此查询的性能非常低。

      【讨论】:

        【解决方案4】:

        除非我把你的问题弄错了,如果只是为了查找查询返回的记录数,你可以试试下面的版本:

         session.createQuery("select count(first_name) from Users
         group by first_name)").list().size();
        

        请注意,上述查询中的 Users 是实体名称而不是表名称。

        如果您正在寻找与您的 SQL 查询类似的 HQL 查询语法(即,从子句中的子选择),则 Hibernate HQL 不支持 HHH-3356

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-02
          • 2014-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多