2011-08-29 63 views
1

我有這樣非常簡單的數據模型: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); 
+0

見下面我更新的答案,得到它的再次合作 – eon

+0

更新的答案,返回其在HQL – eon

+0

最員工再次更新,希望最後更新 – eon

回答

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人,你會關心哪個公司的身份證號碼?你對數字50還是公司ID更感興趣?

+0

您將在您的代碼示例中將屬性添加到Employee類,而不是公司。不過,我希望有更好的解決辦法,比給公司類增加不明確的屬性有更好的解決方案:/ – Xorty

+0

對不起,現在修好了 – eon

+0

這不是有效的HQL,沒有GROUP BY就不能有HAVING。 –

0

退房休眠chapter on HQL,特別是聚合函數部分:

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

+0

感謝公司ID,但由於它沒有,這是沒有幫助在我的案例中提及與集合作爲​​屬性(c.employees)相關聯。 – Xorty

+0

真的是downvote的原因嗎? – eon

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); 

上面的代碼假定只有一個公司,有最多的員工。當然,多家公司可能擁有相同數量的員工,這也是最多的。

+0

首先,thanx爲您的努力。這可能會起作用,但這不是太複雜嗎?我不妨選擇所有的公司,並用Java代碼迭代它們,這會更直接,或者? :) – Xorty

+0

不,實際上是相當不錯:)我喜歡更多的eon的查詢,但你有正確的休息。 – Xorty

0

嘗試:

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

在代碼中,你只檢索的第一個元素。

query.setMaxResult(1);