Допустим, у меня есть следующий метод в JpaRepository:
@EntityGraph(value = "Subject.allJoins", type = EntityGraphType.FETCH)
@Query("select s from Subject s" + FIND_QUERY_WHERE)
Page<Subject> findInProject(@Param("projectId") UUID projectId, <additional params>
Как видите, я уже использую EntityGraph с нужными мне соединениями. Результирующий запрос SQL, который генерирует Hibernate, выглядит следующим образом (где в основном опущены)
select
subject0_.id,
<all kinds of fields including some duplicates>
from
subject subject0_
left outer join project project1_ on subject0_.project_id = project1_.id
left outer join subject_property_value properties2_ on subject0_.id = properties2_.subject_id
left outer join property_value propertyva3_ on properties2_.property_value_id = propertyva3_.id
left outer join ingestion_id_mapping ingestedme4_ on subject0_.id = ingestedme4_.subject_id
where
subject0_.project_id = '123'
order by
subject0_.name asc
Из-за всех соединений здесь, которые умножают результат на количество строк в результате соединения, результирующий набор разбивается на сотни тысяч строк, даже если общее количество объектов составляет всего несколько сотен.
Обратите внимание, что я буду делать проекцию, и это уже позволит избежать выбора некоторых полей, но объединения все еще необходимы.
Что я могу сделать, чтобы оптимизировать это?
Примечание. Мне действительно нужны все данные для немедленной сериализации для клиента, поэтому просто оставьте его в Hibernate, получив модель entity и использование методов Getter для каждой ассоциации занимает намного больше времени, чем это.
Моя текущая идея состоит в том, что я должен выполнять запрос несколько раз с одним и тем же where для каждого отдельного соединения, а затем объединять результаты в единый объект. Это не конец света, если я прочитаю больше или меньше строк в последующем запросе из-за добавленных или удаленных строк в исходной таблице, потому что я могу просто взять наименьшее подмножество идентификаторов субъектов и получить из этого результат. 1016 * Но есть ли что-нибудь умнее и / или проще, чем это?