У меня есть 3 объекта, назовем их Родитель, Дочерний1 и Дочерний2. Родитель имеет отношение @OneToOne с двумя другими:
Код: Выделить всё
@OneToOne(mappedBy = "team", fetch = FetchType.LAZY, optional = false)
Запросы выполняются с использованием 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