使用jpql获取集合中的最大元素数

时间:2012-03-30 18:33:25

标签: jpa max jpql named

我有以下两个实体(1:N):

@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" )

我的第二个想法是在User实体上编写命名查询:

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

这里我也不知道如何获得最大分配工作的数量....

有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

要按作业大小列出用户订单,您可以使用以下JQL:

from User order by jobs.size desc

使用Hibernate和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仅列出使用TypedQuery.setMaxResults(1)查询的最多作业的最高用户,该查询生成了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 limit ?

答案 1 :(得分: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部分