GroupBy /查询的Java HQL问题

时间:2015-04-22 15:12:22

标签: java sql database hibernate hql

我必须使用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不起作用。

有关如何使其工作的任何帮助?感谢。

1 个答案:

答案 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
  1. prop1 ... propn是Vigilant的所有属性(EAGER取得进一步复杂化)
  2. having不是必需的,因为你已经有一个INNER JOIN,如果没有博物馆,则不会返回警惕
  3. forename过滤器在WHERE子句
  4. 中更有意义

    我的建议是使用更简单的查询:

    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)