JPA 2 - INNER JOIN再次调用Query

时间:2015-09-23 01:45:56

标签: java hibernate jpa jpa-2.0

我试图在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 =?

1 个答案:

答案 0 :(得分:1)

您正面临选择n + 1问题

您获取的第一个查询将检索您想要的列表,但为了实例化实体Traslado的对象,Hibernate会为每个对象调用一个select语句,以确定它是否与TrasladoHora关联,因为关系映射到TrasladoHora表中(我的意思是TrasladoHora.traslado是此双向关联的所有者方)。

Here is a answer由很多人提出建议,但在Tuning fetch strategies

部分的Hibernate文档中提到了问题和一些解决方法

编辑:I also respond another question与此问题相关,也许您会在那里找到更明确的解释。