当前位置: 首页 > 知识库问答 >
问题:

HQL访问@ManyToOne字段的子类对象

邵凯定
2023-03-14

我有一个场景,下面是超类:-

abstract class  Container
{
    Long id;
    FieldParent parent;
}

class SubContainer extends Container
{
    Long extid;
}

abstract class FieldParent
{
    Long fid;
    String name;
}

class SubField  extends FieldParent
{
    String typeOfSub;
}

我正在使用每子类表策略使用一个鉴别器下面是容器的hbm映射:-

<class name="Container" table="Container">
    <id name="id" type="long" column="ID">
        <generator class="native"/>
    </id>
     <many-to-one name="parent"
                     class="FieldParent"
                     cascade="none"
                     column="FieldParentID"/>
    <discriminator column="TYPE"/>
    ....
    <subclass name="SubContainer"
                  discriminator-value="S"
                  lazy="true">
          <property name="extid"  type="long"  column="extid" not-null="true"/>
    </subclass>
</class>

下面是FieldParent的hbm映射:-

   <class name="FieldParent" table="FieldParent">
        <id name="fid" type="long" column="FID">
            <generator class="native"/>
        </id>
        <property name="name"  type="java.lang.String"  column="name" not-null="true"/>
        <discriminator column="TYPE_Parent"/>
        ....
        <subclass name="SubField"
                      discriminator-value="F"
                      lazy="true">
            <property name="typeOfSub"  type="java.lang.String"  column="typeOfSub" not-null="true"/>
        </subclass>
    </class>
getHibernateTemplate().find(
        "from " + SubContainer.class.getName()
                + " subContainer where subContainer.extid = ? and subContainer.parent.typeOfSub=? ",
        new Object[]{new Long(id), "sampeTypeoFSub"});

java.sql.SqlSyntaxerRoreXception:ora-00904:“FieldParent1_3_”.“TypeOFSub”:无效标识符

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1281) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628) [ojdbc6.jar:11.2.0.3.0]
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493) [ojdbc6.jar:11.2.0.3.0]
    at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342) [:6.0.0.Final]
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) [:3.6.10.Final]
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) [:3.6.10.Final]

共有1个答案

帅博远
2023-03-14

TypeOFSub属性位于SubField类中,而ContainerFieldParent具有多对一的关联。

>

  • 您可以将属性移动到fieldparent
  • 您筛选与子类类型的关联:

    select subContainer
    from SubContainer subContainer
    where 
        subContainer.parent.class = my.package.SubField
        subContainer.extid = ? and 
        subContainer.parent.typeOfSub=?
    

  •  类似资料:
    • 问题内容: 我有一个名为 Geometry 的基类,在该基类中存在 Sphere 子类: 和一个子类: 我有一个包含所有 Geometry 对象的ArrayList,我想对其进行迭代以检查是否正确读取了文本文件中的数据。到目前为止,这是我的迭代器方法: 如何访问和打印 球体的 半径和中心字段?提前致谢 :) 问题答案: 如果要访问子类的属性,则必须转换为子类。 但是,这并不是最OO的处理方式:一旦

    • 我的背景是C,在那里我们可以使用子类对象访问父类的公共字段。示例: 如何在Java继承中实现同样的功能? 我还有另一个关于覆盖的问题,但由于Stackoverflow规则,我将作为单独的问题提问。 那么,使用子类对象引用打印/访问Java的父类方法的语法应该是什么?我尝试了。等,但不工作。

    • 我试图找到一种很好的方法来迭代并打印出ArrayList中的对象。 问题是我似乎无法到达用户键入对象信息(例如颜色和品牌)的字段。 对象的新实例如下所示: 汽车(以及自行车、公共汽车等其他类别)是汽车的子类。 车辆等级: } 汽车等级: }尝试迭代对象时: 当迭代对象时,我希望达到I.color中的颜色和品牌字符串。但是我猜想,由于我是一个新的对象,它可能无法访问与汽车、公共汽车等相关的字段和方法

    • 问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接

    • 我正在努力解决一个奇怪的问题。 控制台是 如您所见,第一行输出了GeneratorField对象的名称,但是为什么第二个命令失败了? 我正在使用Freemarker 2.3.20 谢啦

    • 问题内容: 我有一个类,该类具有一个命名的字段(它与我的类具有相同的类型并具有修饰符): 在该类中,我定义了一个名为的方法,该方法具有一个类型为type的参数。我想知道为什么我可以直接访问实例字段?我的意思是该字段是,不是通过实例受害者无法访问的吗? 问题答案: 隐私不是针对每个实例的,而是针对每个班级的。 该类可以访问所有实例的私有字段。 例如,该方法可以将o(如果适用)转换为相同类型,并将其私