【问题标题】:HQL Query having conditions on associated object's associated objects对关联对象的关联对象具有条件的 HQL 查询
【发布时间】:2014-10-29 17:57:24
【问题描述】:

我有以下查询:

FROM PatientInfo AS pi WHERE pi.customerApplicationPatient.customerApplication.customerApplicationId = :customerApplicationId AND pi.customerAppPatient.patient.patientId = :patientId

PatientInfo、CustomerApplicationPatient 关联,customerApplicationPatientId 为外键列。

CustomerApplicationPatient 与 CustomerApplication 关联,Patient 与 customerApplicationId 关联,patientId 作为外键列。

问题:获取给定 customerApplicationId 和 PatientId 的所有 PatientInfo 记录。从某种意义上说,我的查询是一个很好的查询,不会产生太多的内部连接或交叉连接?有更好的方法吗?

我非常感谢任何帮助,并希望问题很清楚。

谢谢, 斯里

【问题讨论】:

  • 您应该删除 sql 标记,因为它不包含 SQL。
  • @user1290226 能否请您指出上述 HQL 查询中的 sql 代码。谢谢。

标签: java sql hibernate jpa hql


【解决方案1】:

当您需要在 where 子句中引用隐式连接时,不应依赖它们。

所以而不是:

FROM PatientInfo AS pi WHERE
pi.customerApplicationPatient.customerApplication.customerApplicationId = :customerApplicationId 
AND pi.customerAppPatient.patient.patientId = :patientId 

select pi 
from PatientInfo AS pi
inner join pi.customerApplicationPatient cap
inner join cap.customerApplication ca
inner join cap.patient p
where
    ca.customerApplicationId = :customerApplicationId 
    AND p.patientId = :patientId 

显式连接将被转换为您期望的确切连接语句。前面的查询可能没有那么聪明,可能会加入同一个子表两次。

【讨论】:

  • 谢谢你,我会尝试这两个查询,看看有什么不同。
猜你喜欢
  • 2013-06-08
  • 2023-03-20
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多