这是我的问题:
我有这个课,它有很少@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
答案 0 :(得分:0)
指向连接只是使得atributtes可用于条件和其他东西的位置,你应该使用FETCH来使关系渴望并使其成为中心,避免懒惰的指示器,如
from AttributeList AL inner join FETCH PropertyAttributeLink PA where PA.hotelID=:hotelID
如您所见并不那么难,我希望这对您有所帮助,您可以一如既往地在文档中获取更多信息HQL - Associations and joins