0

我有以下两个实体 (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 ??????")

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

有人可以帮帮我吗?

4

2 回答 2

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零件

于 2012-04-16T03:49:24.243 回答
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

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

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 ?
于 2012-03-31T15:10:14.830 回答