Можно ли добавить в запрос JPA предложение, которое возвращает пользовательский объект? - PullRequest
1 голос
/ 09 марта 2020

У меня следующий запрос jpa (я исключил из него нерелевантную информацию):

@Query(value = "SELECT new SomeEntitySummary(et.id, count(ret.id)) " +
        "FROM SomeEntity et left join SomeRelatedEntity ret on ( ... ) " +
        "WHERE ... " +
        "group by et.id"
    )

В результате он возвращает пользовательский объект, а не сущность.

Можно ли включить в него предложение has?

Эквивалент sql работает и будет выглядеть примерно так:

select et.id,count(ret.id)
from someentity et
left join somerelatedentity ld on (...)
group by et.id
**having count(ret.id) between 1 and 100**

Можно ли написать это в запросе jpa? Мне пока не удалось найти соответствующие примеры: (

1 Ответ

1 голос
/ 09 марта 2020

Да, это возможно. Согласно документации hibernate (см. 15.51. Группировка по разделу ).

В групповом запросе предложение where применяется к неагрегированным значениям (по сути, оно определяет, ряды превратят его в агрегацию). Предложение HAVING также ограничивает результаты, но оно работает с агрегированными значениями.

Предложение HAVING следует тем же правилам, что и предложение WHERE, и также состоит из предикатов. HAVING применяется после того, как группировка и агрегация были выполнены, в то время как предложение WHERE применялось ранее.

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

SELECT new SomeEntitySummary(et.id, count(ret.id))
FROM SomeEntity et left join SomeRelatedEntity ret on ( ... )
WHERE ... 
group by et.id
having count(ret.id) between 1 and 100
...