Выберите запись с максимальным значением из каждой группы с помощью Query DSL

У меня есть таблица результатов, в которой есть результаты игроков, и я хочу выбрать уникальные записи для каждого игрока с наибольшим счетом.

Вот таблица:

id | player_id | score | ...
1  | 1         |  10   | ...
2  | 2         |  21   | ...
3  | 3         |  9    | ...
4  | 1         |  30   | ...
5  | 3         |  2    | ...

Ожидаемый результат:

id | player_id | score | ...
2  | 2         |  21   | ...
3  | 3         |  9    | ...
4  | 1         |  30   | ...

Я могу добиться этого с помощью чистого SQL следующим образом:

SELECT *
FROM player_score ps
WHERE ps.score = 
(
    SELECT max(ps2.score)
    FROM player_score ps2
    WHERE ps2.player_id = ps.player_id
) 

Можете ли вы сказать мне, как добиться того же запроса с запросом dsl? Я нашел несколько решений с помощью JPASubQuery, но этот класс у меня не работает (моя IDE не может разрешить этот класс). Я использую querydsl 4.x. Заранее спасибо.


person Denis Stephanov    schedule 09.11.2018    source источник


Ответы (1)


JPASubQuery был удален в querydsl 4. Вместо этого используйте JPAExpressions.select. Ваше предложение WHERE должно выглядеть примерно так:

.where(playerScore.score.eq(JPAExpressions.select(playerScore2.score.max())
                            .from(playerScore2))
                            .where(playerScore2.playerId.eq(playerScore.playerId)))
person Robert Bain    schedule 15.11.2018