【发布时间】: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