как оптимизировать HQL-запрос, объединяющий две большие таблицы - PullRequest
0 голосов
/ 06 июня 2018

У меня есть HQL-запрос, подобный этому:

Select foo
From Foo foo, Bar bar
Where foo.number = bar.number

, но для выполнения требуется hibernate 4, 5 секунды, потому что две таблицы очень большие.и я сделал трассировку с помощью статистики Hibernate и журнала трассировки и обнаружил, что этот HQL-запрос выполняет 500 Select!вот почему это занимает много времени, потому что у меня есть 3 manyToOne в первой таблице и 7 ManyToOne & OneToMany в другой.Есть ли способ оптимизировать этот HQL-запрос без использования или преобразования его в SQL-запрос?

в случае использования нативного SQL-запроса, мне нужно переназначить результаты из объектов в объект-объект foo, который я не используюпредпочитают.

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Вы должны использовать следующие аннотации:

 @OneToMany(fetch = FetchType.LAZY, mappedBy = "your_mapping_name")
        @Cascade(CascadeType.ALL)
        @Fetch(FetchMode.SELECT)
            @BatchSize(size = 10)

для получения дополнительной информации вы можете просмотреть: https://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/

0 голосов
/ 19 июня 2018

Без кода сущностей сложнее найти точный ответ для этого, но в большинстве случаев проблема заключается в отношениях EAGER .

у меня есть 3 manyToOne вПервая таблица и 7 ManyToOne и OneToMany в другой.

Первый шаг - убедиться, что все ToOne сопоставления LAZY, а не EAGER.Каждое отношение ToOne (@ManyToOne и @OneToOne) равно EAGER по умолчанию .Поэтому измените отношение на LAZY:

@ManyToOne(fetch = FetchType.LAZY)

Или:

@OneToOne(fetch = FetchType.LAZY)

Также убедитесь, что отношения ToMany не EAGER(по умолчанию они LAZY).

...