Одна вещь, которая мне нравится в 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, эти же критерии будут использоваться и для загрузки адреса.
Поэтому вместо одного запроса вы выполняете 5.
Если вы делали это с объединениями, вы мощь получите все в одном запросе, но вы вполне можете загружать намного больше данных из-за объединений.
В любом случае, я искал в документации по Hibernate аналог этого, но не нашел его. Есть один?




Я знаю две вещи, которые могут помочь:
1) hibernate.default_batch_fetch_size
2) Criteria.setFetchMode и Criteria.setFetchSize
Нет ни одного.