2016-12-07 9 views
0

Я использую критерии для выбора списка объектов, которые имеют поле, относящееся к другим таблицам, поэтому я использую псевдонимы. Проблема в том, что когда я пытаюсь получить доступ к объединенному полю, hibernate выполняет другой выбор в базе данных. Это действительно неэффективно, так как это предварительно формирует один запрос для каждой строки результата.Критерий спящего режима для доступа к объединенным полям

Может ли кто-нибудь сказать мне, почему это происходит?

использование критериев (уменьшенная только соответствующие строки)

List<Country> list = session.createCriteria(Country.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .createAlias("locations", "location") 
    .list(); 

for (Countries cntry : list){ 
    cntry.getLocations().size(); // here hibernate execute another query 
} 

Страна (важная часть)

@Entity 
public class Country { 

    // other fields as uuid etc. 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "country") 
    private List<Location> locations; 

    // getters and setters 
} 

Расположение (важная часть)

@Entity 
public class Location { 

    // other fields as uuid etc. 

     @ManyToOne(fetch = FetchType.LAZY) 
     @JoinColumn(name = "COUNTRY_UUID") 
     private Country country; 

    // getters and setters 
} 

ответ

1

попробовать:

List<Country> list = session.createCriteria(Country.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .setFetchMode("locations", FetchMode.JOIN) 
    .createAlias("locations", "location") 
    .list(); 

Это должно привести один запрос, который извлекает все страны и расположения.

В дополнение к этому у вас должно быть @BatchSize на месте. @BatchSize (size = 20) вызовет 1 оператор для каждых 20 отношений, если у вас нет установленного режима выборки.

+0

Запрос включал все поля всех связанных таблиц, но выглядит, что эти поля не установлены. Настройка режима выборки не помогла :( – cici

+1

Ваша проблема, безусловно, в вашем режиме выборки. Какая версия спящего режима вы используете? Старые версии вам может понадобиться FetchMode.EAGER. – teacurran