【问题标题】:hibernate one to many query using mappings使用映射休眠一对多查询
【发布时间】:2013-06-02 18:42:46
【问题描述】:

我有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>

我需要一种方法来选择一个具有关联的 SigTcContraloriaObjetivo 和关联的 SigTcContraloriaAccion 的 SigTcContraloriaIniciativa

这是我使用的查询:

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() 时,它为每个 SigTcContraloriaIniciativas 返回一个 SigTcContraloriaObjetivos(如预期)、两个 SigTcContraloriaIniciativas(未预期,我只希望一个)和两个 SigTcContraloriasAcciones(仅预期一个)

更新:

这是桌子的图片:

【问题讨论】:

  • 能把数据库里的数据给我们看清楚吗?
  • 好的,我会尽快更新帖子
  • 在数据库中应该有一个 SigTcContraloriasAcciones 和 SigTcContraloriaIniciativas 的连接表。这张表里有什么?
  • ID_INICIATIVA 列是这些表之间的关系...i.stack.imgur.com/KJlks.jpg
  • objetivo和iniciativas的关系是"ID_OBJETIVO",iniciativas和aciones的关系是"ID_INICIATIVA",所以一个OBJETIVO有很多INICIATIVAS,一个INICIATIVA有很多ACCIONES

标签: java hibernate jakarta-ee jpa hql


【解决方案1】:

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

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

我想你在期待:

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

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

【讨论】:

  • 是的,这就是我想要的结果!那么,如果你说hibernate不能那样工作,我怎么能达到这个结果呢?
  • 鉴于您的查询正在搜索 SigTcContraloriaObjetivos 并且您得到了正确的结果,我不得不问您为什么想要该结果。
  • 因为我想将 where 条件设置为 SigTcContraloriaAcciones 例如,如果我想查询所有 idOrganizion = 8 的 SigTcContraloriaAcciones。我需要的结果是 idOrganizacion = 8 的 SigTcContraloriaAcciones,SigTcContraloriaIniciativas 与此 SigTcContraloriaAcciones 以及与此 SigTcContraloriaIniciativas 相关的 SigTcContraloriaObjetivos
  • 也许我应该使用相反的方式,但我不知道这是否有效或是否适用于此。
  • 您可以在选择查询中添加列,以仅获取子表中条件和休眠将返回对象[]的列。然后,您可以通过迭代数组将 Object[] 转换为您的 DTO 类。 Like String sql = "select distinct p, c.description, b.description from SigTcContraloriaObjetivos p join p.children c join c.children b where and b.idOrganizacion = 8";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2014-11-26
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多