Запрос JPA + Hibernate для разбиения на страницы завершается сбоем при использовании выборкиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Запрос JPA + Hibernate для разбиения на страницы завершается сбоем при использовании выборки

Сообщение Anonymous »

У меня есть 3 объекта, назовем их Родитель, Дочерний1 и Дочерний2. Родитель имеет отношение @OneToOne с двумя другими:

Код: Выделить всё

@OneToOne(mappedBy = "child1", fetch = FetchType.LAZY, optional = false)
private Child1 child1;
@OneToOne(mappedBy = "child2", fetch = FetchType.LAZY, optional = false)
private Child2 child2;
Запросы выполняются с использованием JpaSpecificationExecutor и передаются как объекты спецификации, так и Pageable. Обе связи указаны в спецификации, поэтому сгенерированный SQL выглядит примерно так:

Код: Выделить всё

select 
from parent p
join child1 c1 
join child2 c2 
order by 
limit M offset N
Проблема возникает, когда результатов больше, чем может вместить одна страница, поэтому JPA приходится выполнять подсчетный запрос. И способ, которым SimpleJpaRepository это делает, заключается в простом применении той же спецификации, которую вы дали ему, к этому новому запросу подсчета.
Это приводит к исключению:

Код: Выделить всё

org.hibernate.query.SemanticException: Query specified join fetching, but the owner of the fetched association was not present in the select list [SqmSingularJoin(Parent(332551168492391).child1(332551168541736) : child1)]]
Это, я думаю, имеет смысл, поскольку сгенерированный запрос будет выглядеть примерно так:

Код: Выделить всё

select count(*)
from parent p
join child1 c1 
join child2 c2 
order by 
То есть мы объединяем таблицы, но на самом деле ничего из них не выбираем.
Итак, как лучше всего поступить отсюда? ?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-fetches
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»