2012-03-30 65 views
0

我有以下两个实体(1:N):获取元素的最大数量的集合与JPQL

@Entity 
public class Job { 

@ManyToOne 
private User user 

} 

@Entity 
public class User { 

@OneToMany 
private Collection<Job> jobs; 

} 

现在我想写与JPQL命名查询从而获得大部分工作的用户。

通过对作业实体的以下查询,我可以检索每个用户的作业数量......但不知何故,我必须将其与具有最多作业数量的用户的作业数量进行比较所有...

@NamedQuery(query="SELECT j.user, COUNT(j) FROM Job j GROUP BY j.user") 

我的第二个想法是写在用户的实体命名查询:

@NamedQuery(query="SELECT u.username FROM User u WHERE SIZE(u.jobs) = MAX ??????") 

这里此外,我不知道如何获得最大分配作业的数量.. ..

有人可以帮我吗?

回答

0

要通过作业大小列出,您可以使用下面JQL用户定单:

from User order by jobs.size desc 

即生成使用与HSQLDB休眠的SQL语句:

select 
    user0_.id as id0_ 
from 
    User user0_ 
order by 
    (select 
     count(jobs1_.user_id) 
    from 
     Job jobs1_ 
    where 
     user0_.id=jobs1_.user_id) desc 

要查找的最大作业大小用户,您可以限制JPA仅列出使用最多作业的顶级用户,使用为HSQLDB生成以下SQL的查询的TypedQuery.setMaxResults(1)

select 
    user0_.id as id0_ 
from 
    User user0_ 
order by 
    (select 
     count(jobs1_.user_id) 
    from 
     Job jobs1_ 
    where 
     user0_.id=jobs1_.user_id) desc limit ? 
0

我发现类似于查询以下成功给我的用户列表中下降的作业数的顺序,他们有:

SELECT u FROM User u LEFT JOIN FETCH u.jobs 
ORDER BY u.jobs.size DESC 

然后,如果你只是得到的第一个结果,那么你会让用户获得最多的工作。那是你想要的吗?

或者,让所有有就业机会的最大数量的用户,你可以使用:

SELECT u FROM User u LEFT JOIN FETCH u.jobs 
WHERE u.jobs.size = (SELECT max(jobs.size) FROM User) 

你可能不需要LEFT JOIN FETCH部分