How to access joined-subclass's properties in HQL?

410 Views Asked by At

Consider the following hibernate mapping (using hibernate 4):

Answer with a DataCollection joined-subclass:

<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 with a PatientForm joined-subclass:

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

Question: Using HQL, how can you ask for "all datcollections whose AnsweredForm belongs to patient x"?

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

This HQL yields the error:

ERROR: missing FROM-clause entry for table "answeredfo2_2_"

And rightly so, as the SQL translation of this query is:

 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 = ?  
1

There are 1 best solutions below

0
SternK On

Try to use the following hql:

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

Look at this part of the hibernate documentation for additional explanations and examples.