使用映射来休眠一对多查询

时间:2013-06-06 16:34:42

标签: java hibernate java-ee jpa hql

我有3个类,其中包含相应关系父子:

// SigTcContraloriaObjetivos,SigTcContraloriaIniciativas,SigTcContraloriaAcciones

<class dynamic-insert="false" dynamic-update="true" mutable="true" name="org.citi.tablero.contraloria.planes.model.db.hibernate.dto.SigTcContraloriaObjetivos" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="SIG_TC_CONTRALORIA_OBJETIVOS">
    <id column="ID_OBJETIVO" name="idObjetivo">
        <generator class="sequence">
            <param name="sequence">SEQ_SIG_CONTRALORIA_OBJETIVOS</param>
        </generator>    
    </id>
    <property column="DESCRIPCION" name="descripcion"/>
     <set name="children" inverse="false" cascade="all" lazy="false">
        <key column="ID_OBJETIVO"/>
        <one-to-many class="SigTcContraloriaIniciativas"/>
    </set>          
</class>

<class dynamic-insert="false" dynamic-update="true" mutable="true" name="org.citi.tablero.contraloria.planes.model.db.hibernate.dto.SigTcContraloriaIniciativas" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="SIG_TC_CONTRALORIA_INICIATIVAS">
    <id column="ID_INICIATIVA" name="idIniciativa">
        <generator class="sequence">
            <param name="sequence">SEQ_SIG_CONTRALORIA_INICIATIVA</param>
        </generator>    
    </id>
    <property column="DESCRIPCION" name="descripcion"/>
    <property column="ID_OBJETIVO" name="idObjetivo" /> 
     <set  name="children" inverse="false" cascade="all" lazy="false">
        <key column="ID_INICIATIVA"/>
        <one-to-many class="SigTcContraloriaAcciones"/>
    </set>      
</class>

<class dynamic-insert="false" dynamic-update="true" mutable="true" name="org.citi.tablero.contraloria.planes.model.db.hibernate.dto.SigTcContraloriaAcciones" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="SIG_TC_CONTRALORIA_ACCIONES">
    <id column="ID_ACCION" name="idAccion">
        <generator class="sequence">
            <param name="sequence">SEQ_SIG_CONTRALORIA_ACCIONES</param>
        </generator>    
    </id>
    <property column="DESCRIPCION" name="descripcion"/>
    <property column="ID_INICIATIVA" name="idIniciativa" /> 
    <property column="ID_ORGANIZACION" name="idOrganizacion" />
</class>

我需要一种方法来选择一个SigTcContraloriaIniciativa与相关的SigTcContraloriaObjetivo和相关的SigTcContraloriaAccion

这是我使用的查询:

String sql = "select distinct p from SigTcContraloriaObjetivos p join p.children c join c.children b where and b.idOrganizacion = 8";

(在数据库中我只有一个带有idOrganizacion = 8的SigTcContraloriaAccion,所以我的预期结果是一个SigTcContraloriaObjetivos,相应的SigTcContraloriaIniciativas与相应的SigTcContraloriaAccion即时选择)

我的问题是,当我执行query.list()时,它返回一个SigTcContraloriaObjetivos(如预期的那样),两个SigTcContraloriaIniciativas(不期望,我只期望一个),以及两个SigTcContraloriasAcciones(只有一个预期),每个SigTcContraloriaIniciativas

更新:

这是表格的图像:

TABLES

1 个答案:

答案 0 :(得分:2)

我认为您的查询返回了正确的结果,但您不理解它。

正如您所说,正在返回正确的SigTcContraloriaObjetivos对象。你得到的是对象及其所有关联(假设获取类型为EAGER)。但是,这些关联不会根据您的查询进行过滤。

我认为你期待:

SigTcContraloriaObjetivos (ID=1)
----- SigTcContraloriaIniciativas (ID=1)
       ----- SigTcContraloriaAcciones (ID=5)

JPA / Hibernate无法正常工作。此类查询的结果将始终是符合条件的对象,并且这些对象将包含其所有关联对象。