我是hibernate的新手。 我使用下面的代码来获取我的对象
@Transactional(readOnly = true,propagation=Propagation.NEVER)
public StaffSkillChecklist listSkillMatrixByChecklistIdForStaff(Long checklistid, Long staffId) {
StaffSkillChecklist sc = (StaffSkillChecklist) em.unwrap(Session.class)
.createCriteria(StaffSkillChecklist.class, "staffchecklist")
.createAlias("staffchecklist.staffSkillRatingSet", "staffSkillRating", JoinType.LEFT_OUTER_JOIN)
.setFetchMode("staffSkillRating", FetchMode.JOIN)
.createAlias("staffchecklist.skillChecklist", "skillChecklist", JoinType.LEFT_OUTER_JOIN)
.setFetchMode("skillChecklist", FetchMode.JOIN)
.createAlias("staffSkillRating.skillGroup", "skillGroup", JoinType.LEFT_OUTER_JOIN)
.setFetchMode("skillGroup", FetchMode.JOIN)
.createAlias("staffSkillRating.skill", "skill", JoinType.LEFT_OUTER_JOIN)
.setFetchMode("skill", FetchMode.JOIN)
.createAlias("staffSkillRating.skillRating", "skillRating", JoinType.LEFT_OUTER_JOIN)
.setFetchMode("skillRating", FetchMode.JOIN).addOrder(org.hibernate.criterion.Order.asc("id"))
.add(Restrictions.and(Restrictions.eq("staffchecklist.staff.id", staffId),
Restrictions.eq("skillChecklist.id", checklistid)))
.uniqueResult();
return sc;
}
现在在我的serviceclass中,我需要迭代对象并转换为DTO但是这样做,hibernate再次查询db
public SkillChecklistDTO toDTO(SkillChecklist skillChecklist, int depth) {
if (skillChecklist == null) {
return null;
}
Set<SkillChecklistGroup> scgList = new HashSet<SkillChecklistGroup>();
//HIBERNATE WILL FIRE A QUERY again
scgList = skillChecklist.getChecklistGroups();
return dto;
}
如何阻止hibernate再次触发查询。我的第一个查询包含了我想要的一切。
答案 0 :(得分:0)
默认情况下,Hybernate在OneToMany关系上应用延迟加载。 因此,您应该在注释中添加fetch = FetchType.EAGER。
@OneToMany(fetch = FetchType.EAGER)
您还应尝试将.setFetchMode("skillChecklist", FetchMode.JOIN)
替换为.setFetchMode("skillChecklist", FetchMode.EAGER)