【问题标题】:How to access joined-subclass's properties in HQL?如何在 HQL 中访问joined-subclass 的属性?
【发布时间】:2021-11-13 18:12:58
【问题描述】:

考虑以下休眠映射(使用休眠 4):

Answer 使用 DataCollection 连接子类:

<hibernate-mapping>
    <class name="Answer" table="answer">
        <many-to-one name="answeredForm" class="AnsweredForm" fetch="select">
                <column name="answered_form_id" />
        </many-to-one>
            
        <joined-subclass table="data_collection" name="DataCollection" extends="Answer">
            <key column="id"></key>
         </joined-subclass>
    </class>
</hibernate-mapping>

AnsweredForm 与 PatientForm 连接子类:

<hibernate-mapping>
    <class name="AnsweredForm" table="answered_form">
    
        <joined-subclass table="patientForm"    name="PatientForm" extends="AnsweredForm">
            <many-to-one name="patient" class="Patient" fetch="join">
                <column name="patient_id" />
            </many-to-one>
        </joined-subclass>
            
        </class>
</hibernate-mapping>            

问题:使用 HQL,如何查询“所有 AnsweredForm 属于患者 x 的 datcollections”?

SELECT answer FROM DataCollection answer 
JOIN answeredForm answeredForm
WHERE answer.answeredForm.patient.code=:patientCode

此 HQL 产生错误:

错误:缺少表“answeredfo2_2_”的 FROM 子句条目

这是正确的,因为这个查询的 SQL 翻译是:

 SELECT datacollec0_.id                    AS id1_62_,
       datacollec0_1_.free_text           AS free_tex2_62_   
FROM   data_collection datacollec0_
       INNER JOIN answer datacollec0_1_
               ON datacollec0_.id = datacollec0_1_.id
       CROSS JOIN answered_form answeredfo1_
       CROSS JOIN answered_form answeredfo2_
       CROSS JOIN patient patient3_
WHERE  datacollec0_1_.answered_form_id = answeredfo1_.id
       AND datacollec0_1_.answered_form_id = answeredfo2_.id
       AND answeredfo2_2_.patient_id = patient3_.id
       AND CASE
             WHEN answeredfo1_4_.id IS NOT NULL THEN 4
             WHEN answeredfo1_1_.id IS NOT NULL THEN 1
             WHEN answeredfo1_2_.id IS NOT NULL THEN 2
             WHEN answeredfo1_3_.id IS NOT NULL THEN 3
             WHEN answeredfo1_.id IS NOT NULL THEN 0
           END = 2
       AND patient3_.code = ?  

【问题讨论】:

  • 对我来说这看起来像是一个 Hibernate 错误。即使您弄乱了 HQL,它也不应该生成这样的无效 SQL。我建议在hibernate.atlassian.net/secure/Dashboard.jspa 提出问题 - 即使他们不认为这是一个错误,也应该有人能够帮助你。

标签: java sql hibernate hql sessionfactory


【解决方案1】:

尝试使用以下hql:

SELECT a FROM Answer a 
JOIN a.answeredForm af
WHERE af.patient.code=:patientCode

查看 hibernate 文档的this part 以获得更多解释和示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2017-05-20
    • 2010-12-11
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多