【问题标题】:HQL new list creation and order by countHQL 新列表创建和按计数排序
【发布时间】:2012-03-28 13:48:31
【问题描述】:

我正在按如下方式进行 HQL 查询,并尝试按计数列对列表进行排序:

select new Persons(count(*) as cnt, p.id, p.name, p.city) group by p.city order by cnt

Hibernate 如何给我以下错误:

Unknown column 'cnt' in 'order clause'

有没有办法将城市计数包含到人员对象中并获得一个也按计数排序的列表,还是我必须以其他方式这样做?

我使用 MySQL 作为数据库后端。

干杯,

OsQu

【问题讨论】:

  • 顺便说一句,您的选择是错误的。在group by 中,您必须包含所有非聚合函数的选定列。您要么选择group by p.id, p.name, p.city,要么只选择new Persons(count(*) as cnt, p.city)。您的做法可能适用于 MySQL(为 id 和 name 生成任意值),但不适用于 Oracle。
  • 我使用 MySQL 作为后端。抱歉给您带来不便,更新问题。顺便说一句,如果您要按所有列分组,那么分组有什么意义?
  • 是的。按 id 分组没有意义,因为 count(*) 始终为 1。不,关键是,当您使用“group by”时,在正确的 SQL 中,您只能选择聚合列或 group by 子句中提到的列。例如,如果您选择 p.id 并按 p.city 分组,那么 select 将返回具有相同城市的许多行中的哪个 id? MySQL在这里相当草率,但Oracle抛出错误。如果您只需要虚拟值来满足 Persons 构造函数的需求,请执行 select new Persons(count(*) cnt, 0 id, 'dummy' name, p.city) group by p.city
  • 顺便说一句,对于您的原始问题,请尝试order by Persons.cnt
  • 约翰娜说得真有道理!非常感谢,我离正确理解 group by-clause 又近了一步。最近它给我带来了一些难以理解的问题。下次我在项目中时会尝试 Persons.cnt。

标签: java hibernate hql


【解决方案1】:

啊,在 order by 子句中添加 count(*) 就是这么简单。所以有效的解决方案:

select new Persons(count(*) as cnt, p.id, p.name, p.city) group by p.city order by count(*);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多