Вот моя проблема:
У меня есть этот класс, у него есть несколько @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