我有以下两个实体(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 ??????")
这里我也不知道如何获得最大分配工作的数量....
有人能帮助我吗?
答案 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
部分