我有两张桌子,乐队和投票。 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条件查询。
这很简单,我只是错过了吗?谢谢你的帮助。
答案 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
这假设Band
和Votes
之间存在一对多关联(实际上,在使用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的属性是非聚合的。 您必须列出所有非聚合的 属性明确。