Получить максимальное количество элементов в коллекции с помощью jpql - PullRequest
0 голосов
/ 30 марта 2012

У меня есть следующие две сущности (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 голосов
/ 16 апреля 2012

Я обнаружил, что запрос, подобный следующему, успешно дал мне список пользователей в порядке убывания количества выполняемых ими работ:

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 часть

0 голосов
/ 31 марта 2012

Чтобы перечислить порядок пользователя по размеру задания, вы можете использовать следующий JQL:

from User order by jobs.size desc

Который сгенерировал следующий SQL с использованием Hibernate с HSQLDB:

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) запроса, который сгенерировал следующий SQL для HSQLDB:

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 ?
...