具有group by的SQL连接的HQL版本

时间:2010-08-04 04:32:32

标签: java sql hibernate group-by hql

我有两张桌子,乐队和投票。 Band有一个名字和一个id,而Votes有一个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条件查询。

这很简单,我只是错过了吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:12)

在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和/或Criteria API时提供对象模型非常有用,因为您正在查询对象模型)。

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

  

14.12. The group by clause

     

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

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
     

也允许使用having子句。

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函数和聚合函数   允许在拥有和订购   条款是否得到了支持   底层数据库(即不在   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的属性是非聚合的。   您必须列出所有非聚合的   属性明确。