我试图在JPA 2中进行一些查询,但它一直在调用另一个查询以获取依赖关系的信息
我的课程是:
@Entity
@Table(name = "tbltranslados")
public class Traslado implements Serializable {
@OneToOne(optional = true, mappedBy = "traslado", fetch = FetchType.LAZY)
private TrasladoHora hora;
}
@Entity
@Table(name = "tbltranshora")
public class TrasladoHora implements Serializable {
@OneToOne(optional = false,fetch=FetchType.LAZY)
@JoinColumn(nullable = false, name = "thr_TransladosID")
private Traslado traslado;
}
我这样调用查询:
@SuppressWarnings("unchecked")
@Override
public List<Traslado> listarAtivos() {
return this.session.createQuery("SELECT t , h FROM Traslado t LEFT JOIN t.hora h WHERE t.status=:status ORDER BY t.origem , t.destino")
.setParameter("status", true)
.getResultList();
}
但我的结果是:
休眠:选择traslado0_.TransladosID如Translad1_14_0_,trasladoho1_.TranshoraID如Transhor1_13_1_,traslado0_.tra_Para如tra_Para2_14_0_,traslado0_.tra_De如tra_De3_14_0_,traslado0_.tra_Status如tra_Stat4_14_0_,trasladoho1_.thr_qtdHoras如thr_qtdH2_13_1_,trasladoho1_.thr_TransladosID如thr_Tran3_13_1_从tbltranslados traslado0_ left outer join tbltranshora trasladoho1_ on traslado0_.TransladosID = trasladoho1_.thr_TransladosID where traslado0_.tra_Status =?按traslado0_.tra_De,traslado0_.tra_Para排序 Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =? Hibernate:选择trasladoho0_.TranshoraID作为Transhor1_13_0_,trasladoho0_.thr_qtdHoras作为thr_qtdH2_13_0_,trasladoho0_.thr_TransladosID作为thr_Tran3_13_0_来自tbltranshora trasladoho0_其中trasladoho0_.thr_TransladosID =?
答案 0 :(得分:1)
您正面临选择n + 1问题。
您获取的第一个查询将检索您想要的列表,但为了实例化实体Traslado
的对象,Hibernate会为每个对象调用一个select语句,以确定它是否与TrasladoHora
关联,因为关系映射到TrasladoHora
表中(我的意思是TrasladoHora.traslado
是此双向关联的所有者方)。
Here is a answer由很多人提出建议,但在Tuning fetch strategies
部分的Hibernate文档中提到了问题和一些解决方法编辑:I also respond another question与此问题相关,也许您会在那里找到更明确的解释。