Hibernate Join занимает слишком много времени, чтобы работать - PullRequest
2 голосов
/ 03 апреля 2012

Вот моя проблема:

У меня есть этот класс, у него есть несколько @oneToMany коллекций

public class ActivePropertyList implements Serializable 
{

 @OneToMany
 @JoinTable(name = "PropertyAttributeLink",
 joinColumns =
 @JoinColumn(name = "EANHotelID"),
 inverseJoinColumns =
 @JoinColumn(name = "AttributeID", referencedColumnName="AttributeID"))
 private Collection<AttributeList> attributeList;

 @OneToMany(fetch= FetchType.LAZY)
 @JoinColumn(name="EANHotelID")
 private Collection<Hotelimageslist> hotelimageslist;

 @OneToMany(fetch= FetchType.LAZY)
 @JoinColumn(name="EANHotelID")

 private Collection<Roomtypelist> roomtypelist;
//Getters & Setters ...

Когда я получаю доступ к этому объекту из XHTML , это занимает слишком много времени.долго генерировать, поскольку я использую <ui:repeat value=#{controller.ActivePropertyList.attributeList}> ...

PropertyAttributeLink имеет более 5 миллионов строк, а изображения - более 4 миллионов строк, но когда я использую простой SQL-запрос innerJoin, мне требуется не более нескольких мс для генерации списков.

Я пытался использовать namedQuery для AttributeList с использованием HQL-запроса, но поскольку AttributeList не имеет ссылки на ActivePropertyList, поскольку он является однонаправленным @oneToMany, он выдает ошибку при этом.

Есть ли способ создать HQL NamedQuery для доступа к каждому списку только один раз и сохранить его в контроллере?

что-то вроде

public List<AttributeList> getAttributeListByHotelID(int hotelID){
    Query q = session().createQuery("from AttributeList AL inner join PropertyAttributeLink PA where PA.hotelID=:hotelID");
    return q.list();
}

, но этот метод не работаетпоскольку hql нуждается в AttributeList, чтобы знать о PropertyAttributeLink

1 Ответ

0 голосов
/ 21 июля 2012

Указание объединений просто делает атрибуты доступными для условий и прочего, вы должны использовать FETCH, чтобы сделать отношения стремительными и иметь их сразу, избегая ленивых инициаторов, что-то вроде

from AttributeList AL inner join FETCH PropertyAttributeLink PA where PA.hotelID=:hotelID

Как выувидеть не так сложно, я надеюсь, что это поможет вам, вы можете получить больше информации, как всегда, в документах HQL - Ассоциации и объединения

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