Hibernate инициализирует группу / коллекцию объектов - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть запрос с выборкой объекта на страницах. Каждая страница содержит 100 сущностей. Для этих 100 сущностей мне нужно выбрать несколько вложенных сущностей, которые выбираются ленивыми.

Что происходит, так это то, что я выполнил 1 SELECT для основных объектов, а затем 100 SELECT для вложенных.

Я ищу способ инициализации этих 100 вложенных групп, чтобы в итоге у меня было 1 SELECT для основной сущности и 1 для вложенных.

Моя структура выглядит следующим образом, и я бы предпочел, чтобы она не менялась (у нас было много проблем с выборками EAGER)

public class MyMainEntity {
    private NestedEntity nested;

    @Override
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL,  orphanRemoval = true)
    @JoinColumn(foreignKey = @ForeignKey(name = "exFK_Nest_Enth"))
    public NestedEntity getNested() {
        ...
    }

Есть ли способ сделать это с Hibernate.initialize()

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

По умолчанию в последних версиях гибернации следует Спецификация JPA 2.0 :

Отношения с:

ToMany: Lazy
ToOne: Eager

, но если вы используете старую версию Hibernateвсе отношения устанавливаются по умолчанию с Lazy

В том случае, если вы хотите попытаться получить дочерние отношения, используйте JOIN FETCH, например:

Select m from MyMainEntity m JOIN FETCH m.nested;
0 голосов
/ 07 сентября 2018

Вы можете использовать запрос Hibernate Criteria для извлечения MyMainEntity и использовать crit.createAlias ​​("nested", "ns", Criteria.Subselect). Будет запущено два запроса; один для извлечения MyMainEntity и другой для Nested с запросом MyMainEntity, действующим как подзапрос. А если вы используете Criteria.Join, то он будет запускать только один запрос и получать как MyMainActivity, так и Nested

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...