Как ограничить столбцы, используемые в графе сущностей Hibernate

Hibernate 5.0.10 У меня есть определенный подграф, который выглядит так:

@NamedSubgraph(name = "proc", attributeNodes = { @NamedAttributeNode("name"), @NamedAttributeNode("childTable1"), @NamedAttributeNode("childTable2"), @NamedAttributeNode("childTable3"), @NamedAttributeNode("childTable4") }),

Проблема в том, что при использовании этого подграфа я возвращаю все атрибуты, определенные в корневой таблице (где есть имя), а не только те атрибуты подграфа, которые я указал. Есть ли способ сказать hibernate, чтобы не вызывать этих детей? Мой запрос выглядит так же, как select rec from records rec join rec.proc

2 ответа

  1. Если вы говорите об основных типах, то по умолчанию Hibernate всегда будет их извлекать. Единственный способ включить ленивую загрузку базового типа - это использовать улучшение байт-кода, как описано в этой статье.
  2. Если вы говорите об ассоциациях EAGER, то Hibernate не может переопределить их в LAZY, даже если стандарт JPA говорит, что должен.

И 1., и 2. не являются обязательными требованиями с точки зрения JPA, потому что LAZY - просто подсказка для поставщика JPA.

В целом, графы сущностей JPA являются неоптимальным способом извлечения данных. Избегать ассоциаций EAGER, использовать субъективности и проекции DTO намного лучше, чем графы сущностей.

В большинстве случаев вам даже не нужно извлекать сущности, потому что сущности имеют смысл, только если вы планируете изменить. В противном случае прогноз DTO всегда будет намного более эффективным.

Я написал статью обо всех проблемах, с которыми вы можете столкнуться при использовании модели сущностей здесь, если вы заинтересованы. Так что в целом вы должны избегать этого, если это возможно. Возможно, вы захотите попробовать Blaze-Persistence Entity Views, что является именно его вариантом использования. Вы можете определить целевую структуру, т.е. DTO, как интерфейс и сопоставить атрибуты с выражениями JPQL. Это также поддерживает коллекции и так далее, но работает на уровне JPQL вместо уровня SQL.

Другие вопросы по тегам