我有问题,我无法弄清楚hibernate查询性能。在下面的代码片段中,我需要选择至少有一个映射和过滤映射的实体。我正在使用FETCH JOIN来加载仅过滤映射。 但在这种情况下,我有查询性能问题。 Hibernate的说,警告日志:查询JOIN FETCH性能问题
org.hibernate.hql.ast.QueryTranslatorImpl - FIRSTRESULT与收集指定/获取的maxResults;内存申请 !
当我省略FETCH JOIN并且只保留JOIN查询的速度很快。但是结果我把所有的映射加载到实体中,这对我来说是不可接受的状态。有没有办法提高查询性能?映射表中有很多行。
HQL查询:
select distinct e from Entity
join fetch e.mappings as mapping
where e.deleted = 0 and e.mappings is not empty
and e = mapping.e and mapping.approval in (:approvals)
实体:
@Entity
@Table(name="entity")
class Entity {
...
@OneToMany(mappedBy="entity", cascade=CascadeType.REMOVE, fetch=FetchType.LAZY)
@OrderBy("created")
private List<Mapping> mappings = new ArrayList<Mapping>();
...
}
@Entity
@Table(name="mapping")
class Mapping {
public static enum MappingApproval {
WAITING, // mapping is waiting for approval
APPROVED, // mapping was approved
DECLINED; // mapping was declined
}
...
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="entity_id", nullable=false)
private Entity entity;
@Enumerated(EnumType.STRING)
@Column(name="approval", length=20)
private MappingApproval approval;
...
}
感谢
你可以显示由Hibernate发出的SQL查询吗? – axtavt 2011-02-09 13:05:44
@axtavt我已经添加了来自Hibenate的SQL查询。谢谢你的时间。 – 2011-02-09 13:35:35