我必须使用Hibernate制作一个HQL,以找出博物馆警惕的一些频率的总和,一些博物馆警惕每小时占据相同的班次 - 我想在这个转变中找到Mike Jones的频率。
这是我到目前为止所做的:
select v, m.freq/count(m.id) from Vigilant v inner join v.museums as
m group by m.id having count(m.id) > 0 and v.forename = 'Mike Jones'
这将给我一个Hibernate中的对象列表,带有警戒和数字 - 我得到的数字是正确的,我希望将它们相加 - 即我想要SUM(m.freq / count(m.id) ))并将其作为HQL返回休眠。
我尝试了多种方法,我设计了一个遵循此路径和子查询的SQL解决方案,但是HQL不允许FROM子句中的子查询将我设置回来。现在我不知道如何添加SUM或从select语句中删除v不起作用。
有关如何使其工作的任何帮助?感谢。
答案 0 :(得分:1)
You can't group by whole entities:
group by子句和order by子句都不能包含 算术表达式。 Hibernate目前还没有扩展 分组实体,因此如果所有属性都不能用cat编写分组 猫是非聚集的。您必须列出所有非聚合属性 明确。
所以你的查询会变成这样:
select
v.id,
v.prop1
...,
v.propn,
m.freq/count(m.id)
from Vigilant v
inner join v.museums m
where
v.forename = 'Mike Jones'
group by v.id, v.prop1, .., v.propn
having
不是必需的,因为你已经有一个INNER JOIN,如果没有博物馆,则不会返回警惕forename
过滤器在WHERE子句我的建议是使用更简单的查询:
select
v.id,
m.freq/count(m.id)
from Vigilant v
inner join v.museums m
where
v.forename = 'Mike Jones'
group by v.id
使用选定的ID通过第二个查询检索实体:
select v
from Vigilant v
where v.id in (:ids)