Java HQL访问@manytoOne字段的子类对象

Java HQL访问@manytoOne字段的子类对象,java,hibernate,orm,hql,hibernate-mapping,Java,Hibernate,Orm,Hql,Hibernate Mapping,我有一个场景,其中下面是超类:- abstract class Container { Long id; FieldParent parent; } class SubContainer extends Container { Long extid; } abstract class FieldParent { Long fid; String name; } class SubField extends FieldParent { St

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

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>
但面临“org.hibernate.PropertyAccessException:IllegalArgumentException发生”。
我明白,我不能只是假设它将是子字段对象,所以无法访问字段,但我需要为它让路。我不确定我们是否可以在HQL中施展才华?
我试图寻找解决方案,但没有找到任何类似的问题

以下是堆栈跟踪:

java.sql.SQLSyntaxErrorException:ORA-00904:“FieldParent_3.”“typeOfSub”:无效标识符 在oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:445)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:396)[ojdbc6.jar:11.2.0.3.0] 位于oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.T4CPreparedStatement.executeforderdescripe(T4CPreparedStatement.java:884)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1281)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)[ojdbc6.jar:11.2.0.3.0] 在oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)[ojdbc6.jar:11.2.0.3.0] 位于org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342)[:6.0.0.Final]

更新了异常的堆栈跟踪。仅供参考,FieldParent有3个子类,其中一个是SubField

java.sql.SQLSyntaxErrorException:ORA-00904:“FieldParent1_3_”。“typeOfSub”:无效标识符


typeOfSub
属性位于
子字段
类中,
容器
字段父项
具有多对一关联

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

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

  • 我尝试了@Vladmichalcea的答案,但遗憾的是效果不佳。在深入研究这个问题之后,我认为不可能在HQL中访问子类元素。 这就是我所做的工作,为我工作

    getHibernateTemplate().find("select subCont from " +SubContainer.class.getName()+" subCont, " + SubField.class.getName() +" subField "
    where subCont.extid = ? and subField.typeOfSub=? and subCont.parent.fid=subField.fid",
            new Object[]{new Long(id), "sampeTypeoFSub"});
    

    基本上是把桌子连接起来。类似于内部连接。

    发布完整的堆栈跟踪@NeerajJain真的没有太多问题仍然在更新。希望帮助您检查您没有FieldParent的getter。typeOfSub@xrcwrn我确实有,我没有把它放在这里,但我有代码Hi-Vlad,你能看一下我在这里的帖子吗——Hi@Vladmichalcea,非常感谢。。我不能使用选项1。但我试过选择2。假设您指的是subcainer.parent.class=my.package.SubField。它给了我异常java.sql.SQLSyntaxErrorException:ORA-00904:“FieldParent 1_3_”。“typeOfSub”:无效标识符,我在问题中更新了stacktrace。。您认为我可以避免选项一,并且仍然可以访问HQL中的SubField objects属性吗。
        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]
    
    select subContainer
    from SubContainer subContainer
    where 
        subContainer.parent.class = my.package.SubField
        subContainer.extid = ? and 
        subContainer.parent.typeOfSub=?
    
    getHibernateTemplate().find("select subCont from " +SubContainer.class.getName()+" subCont, " + SubField.class.getName() +" subField "
    where subCont.extid = ? and subField.typeOfSub=? and subCont.parent.fid=subField.fid",
            new Object[]{new Long(id), "sampeTypeoFSub"});