我有这样非常简单的数据模型:
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);
答案 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);