HQL:使用聚合函数进行简单选择时出现问题

时间:2011-08-29 21:08:52

标签: java sql hibernate hql

我有这样非常简单的数据模型:

create table Company (
    id int primary key,
    name varchar(50),
    street varchar(50)
)

create table Person (
    id int primary key,
    name varchar(50),
    surname varchar(50),
    id_company int foreign key references Company
)

像这样对应的java类:

class Company {
    int id;
    String name, street;
    List<Person> employees;
    // getters, setters, ctor
}

class Person {
    int id;
    String name, surname;
    Company employer;
    // getters, setters, ctor
}

现在,我想选择拥有 HQL 的大多数员工的公司。我不知道怎么样,这是我的垃圾伪尝试不起作用:

from Company c having max(c.employees);

4 个答案:

答案 0 :(得分:3)

编辑:这对我有用 - 获取公司ID和员工数

select c.id, max(c.employees.size) from Company c

获取公司对象:

from Company comp
where comp.employees.size = (
  select max(c.employees.size) from Company c
)

如果您还没有eclipse的hibernate插件,那么安装它对它很有用,因为它还会显示生成的sql以便您可以优化您的hql,请参阅http://www.hibernate.org/subprojects/tools.html

想到一些事情,如果两家公司CompA和CompB都拥有最多的员工,比如50,即所有其他公司都少于50,你会关心你回来的公司ID会怎么样?您对数字50或公司ID更感兴趣吗?

答案 1 :(得分:2)

实际上,这不是微不足道的。我想不出用单个查询做你想做的事情的方法,但你可以用两个查询来做到这一点:

String hql = "select p.employer.id, count(*) from Person p group by p.employer.id order by count(*) desc";
Query query = session.createQuery(hql);
query.setMaxResults(1);
List<Object[]> list = (List<Object[]>) query.list();
Object[] oa = list.get(0);
Integer companyId = oa[0];
Company company = session.get(Company.class, companyId);

上述代码假设只有一家公司员工人数最多。当然,多家公司可能拥有相同数量的员工,这也是最大的。

答案 2 :(得分:0)

查看Hibernate chapter on HQL,特别是聚合函数部分:

select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat) from Cat cat

答案 3 :(得分:0)

尝试:

select company from Company company order by company.employees.size

在代码中,您只检索第一个元素。

query.setMaxResult(1);