Одна вещь, которая мне нравится в EclipseLink , имеет замечательную вещь, называемую подсказка пакетного запроса , которую я пока не нашел в Hibernate-эквиваленте.
В целом выполнение целой кучи объединений очень быстро запутывается, и в итоге вы запрашиваете больше данных, чем вам необходимо (помните, что если вы присоединяете человека к 6 адресам, информация о человеке возвращается 6 раз; теперь продолжайте умножать это на дополнительные соединения).
Представьте себе сущность Person с 0: M коллекциями Address, Email, Phone и OrderHistory. Объединение всего, что не хорошо, но с помощью пакетного метода:
List persons = entityManager.createQuery("select p from Person p"
.setHint(QueryHints.BATCH, "p.address")
.setHint(QueryHints.BATCH, "p.email")
.setHint(QueryHints.BATCH, "p.phone")
.setHint(QueryHints.BATCH, "p.orderHistory")
.getResultList();
Это сделает запрос к таблице Person и все. Когда вы впервые обращаетесь к записи адреса, она выполнит одиночный запрос для всей таблицы адресов. Если вы указали условие where в таблице Person, этот же критерий будет использоваться и для загрузки адреса.
Таким образом, вместо того, чтобы делать 1 запрос, вы делаете 5.
Если вы делали это с помощью объединений, вы могли бы получить все это в одном запросе, но вполне возможно, что вы загружаете гораздо больше данных из-за объединений.
Во всяком случае, я искал в документах Hibernate эквивалент этого, но не вижу ни одного. Есть ли один?