Hibernate эквивалентно подсказке пакетного запроса EclipseLink? - PullRequest
5 голосов
/ 22 января 2009

Одна вещь, которая мне нравится в 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 эквивалент этого, но не вижу ни одного. Есть ли один?

Ответы [ 2 ]

4 голосов
/ 26 января 2009

Нет ни одного.

0 голосов
/ 22 января 2009

Есть две вещи, которые я знаю, которые могут помочь:

1) hibernate.default_batch_fetch_size

2) Criteria.setFetchMode и Criteria.setFetchSize

...