Hibernate join需要很长时间才能工作

时间:2012-04-03 11:00:56

标签: java hibernate java-ee jsf-2

这是我的问题:

我有这个课,它有很少@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有超过5Mil的行,而Images有超过4Mil的行,但是当我使用简单的SQL查询时,innerJoin生成列表的时间不会超过几毫秒。

我尝试使用HQL查询在AttributeList上使用namedQuery,但由于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 :(得分:0)

指向连接只是使得atributtes可用于条件和其他东西的位置,你应该使用FETCH来使关系渴望并使其成为中心,避免懒惰的指示器,如

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

如您所见并不那么难,我希望这对您有所帮助,您可以一如既往地在文档中获取更多信息HQL - Associations and joins