【问题标题】:HQL to access the subclass object of @manytoOne fieldsHQL 访问@manytoOne 字段的子类对象
【发布时间】:2015-06-17 07:11:40
【问题描述】:

我有下面是超类的场景:-

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;
}

我使用判别器的每个子类策略使用表 下面是Container的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>

现在我有了 SubContainer 的对象,我是基于 'typeOfSub' 值的查询。 我尝试使用以下查询

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

但面临'org.hibernate.PropertyAccessException:发生IllegalArgumentException'。
我知道我不能只是假设它将是 SubField 对象,因此无法访问这些字段,但我需要找出方法。我不确定我们是否可以在 HQL 中进行投射?
我尝试搜索解决方案,但找不到任何类似的问题。

下面是堆栈跟踪:

java.sql.SQLSyntaxErrorException: ORA-00904: "FieldParent_3_"."typeOfSub": 标识符无效 在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) [ojdbc6.jar:11.2.0.3.0] 在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.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.executeForDescribe(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": 标识符无效

    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]

【问题讨论】:

  • 发布完整的 StackTrace !
  • @NeerajJain 确实没有太多更新的问题..希望有所帮助
  • 请检查您没有 FieldParent.typeOfSub 的 getter
  • @xrcwrn 我有它我没有把它放在这里但我有它在代码中

标签: java hibernate orm hql hibernate-mapping


【解决方案1】:

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

  1. 您可以将该属性移至FieldParent
  2. 您将关联过滤到子类类型:

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

【讨论】:

  • 嗨,弗拉德,你能看看我的帖子吗 -- stackoverflow.com/questions/30894928/…
  • 嗨@VladMihalcea 非常感谢.. 我不能使用选项 1。但是我尝试了选项 2。假设您的意思是 subContainer.parent.class= my.package.SubField 。它给了我异常 java.sql.SQLSyntaxErrorException: ORA-00904: "FieldParent 1_3_"."typeOfSub": invalid identifier ,我在我的问题中更新了堆栈跟踪。你认为我可以避免选项一吗?仍然可以访问 HQL 中的 SubField 对象属性。
【解决方案2】:

我尝试了@VladMihalcea 的答案,但遗憾的是没有用。在深入研究该问题后,我认为不可能在 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"});

基本上加入表格。有点类似于内部连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多