【问题标题】:Error when retrieving child properties in hibernate在休眠中检索子属性时出错
【发布时间】:2013-05-31 11:20:48
【问题描述】:

我收到此错误,我试图在休眠中使用一对多关系访问子属性:

org.hibernate.QueryException:非法尝试取消引用集合 [sigtccontr0_.ID_OBJETIVO.children] 与元素属性引用 [idIniciativa] [来自 org.citi.tablero.contraloria.planes.model.db.hibernate.dto.SigTcContraloriaObjetivos p其中 p.children.idIniciativa = 1]

这是我的查询:

String sql = "from SigTcContraloriaObjetivos p where p.children.idIniciativa = 1";

Dto 的:

public class SigTcContraloriaObjetivos {

    private Long idObjetivo;
    private String descripcion;
    private Set<SigTcContraloriaIniciativas> children;

public class SigTcContraloriaIniciativas {

    private Long idIniciativa;
    private String descripcion;
    private Long idObjetivo;

映射:

<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" /> 

</class>

知道如何访问idIniciativa 吗?

更新:使用提供的查询时:"select p from SigTcContraloriaObjetivos p join p.children c where c.idIniciativa = 1"

query.list() 返回:

对象1:

  1. SigTcContraloriaObjetivos 1.1 SigTcContraloriaIniciativas(儿童)
  2. SigTcContraloriaIniciativas

对象2:

  1. SigTcContraloriaObjetivos 1.1 SigTcContraloriaIniciativas(儿童)
  2. SigTcContraloriaIniciativas

我需要:

  1. 对象 1:SigTcContraloriaObjetivos -> SigTcContraloriaIniciativas (儿童)
  2. 对象 2:SigTcContraloriaObjetivos -> SigTcContraloriaIniciativas (儿童)

【问题讨论】:

    标签: java hibernate jakarta-ee jpa hql


    【解决方案1】:

    您无法使用 Hibernate 以这种方式访问​​集合。像下面这样的东西应该可以工作:

    select p from SigTcContraloriaObjetivos p join p.children c where c.idIniciativa = 1
    

    查看这里了解更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins

    注意,这是针对 Hibernate 3.3 的。

    【讨论】:

    • 嗨,我也试过了,但是这样,问题如下: 查询返回我:Object1:-SigTcContraloriaObjetivos ---------------- ----------SigTcContraloriaIniciativas -SigTcContraloriaIniciativas Object2: -SigTcContraloriaObjetivos --------------SigTcContraloriaIniciativas -SigTcContraloriaIniciativas 我需要:对象 1:SigTcContraloriaObjetivos -> SigTcContraloriaIniciativas 对象 2:SigTcContraloriaObjetivos -> SigTcContraloriaIniciativas
    • 这里看起来很糟糕,所以我更新了帖子,谢谢你的回复
    • @Victor Elizondo 您从查询中获得的结果是否超出您的预期?我对你的编辑有点困惑。
    • 看,如果我使用这个查询:“来自 SigTcContraloriaObjetivos” 它给了我正确的结果,但是当我添加连接时,它会在数组中返回更多对象,包含一个 Objetivos 对象和一个倡议。我想为孩子添加一个条件,这就是我正在尝试的
    • 我还是一头雾水。您是否期望返回的 SigTcContraloriaObjetivos 对象在其关联的子集中仅包含匹配的 SigTcContraloriaIniciativas 对象?如果是这样,查询将不会为您执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2017-11-02
    相关资源
    最近更新 更多