小编典典

SQL的HQL版本与group by联接

hibernate

我有两个表,乐队和投票。Band有一个名称和一个ID,Vote具有total_votes列和一个称为band_id的外键,它指向band.id。

我有很多票,保存在不同的日期。我想做的是找到每个频段的total_votes列的最大值。以下SQL查询有效:

select b.name,max(v.total_votes) as total from band b, votes v 
    where b.id=v.band_id
    group by b.name order by total desc;

不过,我正在使用的系统使用的是Hibernate。我想将该SQL查询重新编写为HQL或Hibernate条件查询。

这容易吗,我只是想念它?谢谢你的帮助。


阅读 357

收藏
2020-06-20

共1个答案

小编典典

在HQL中,您可以尝试一下:

select band.name, max(vote.totalVotes)
from Band band
     join band.votes vote
group by band.name
order by max(vote.totalVotes) desc

这是假设之间存在一个一对多的关联BandVotes(实际上,提供对象模型HQL和/或标准API,因为要查询的对象模型工作时非常有用)。

以防万一,这是文档的相关部分:

[14.12。group

by子句](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-
grouping)

返回聚合值的查询可以按返回的类或组件的任何属性进行分组:

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color

select foo.id, avg(name), max(name)
from Foo foo join foo.names name
group by foo.id

还可以使用Have子句。

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)

如果基础数据库支持SQL函数和聚合函数,则它们的Have和order by子句中允许使用它们(即,MySQL中不支持)。

select cat
from Cat cat
    join cat.kittens kitten
group by cat.id, cat.name, cat.other, cat.properties
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc

group by子句和order
by子句都不能包含算术表达式。Hibernate当前也不会扩展分组的实体,因此,如果未聚合cat的所有属性,则无法按cat编写group。您必须明确列出所有未聚合的属性。

2020-06-20