У меня есть следующий запрос:
FROM PatientInfo AS pi WHERE pi.customerApplicationPatient.customerApplication.customerApplicationId = :customerApplicationId AND pi.customerAppPatient.patient.patientId = :patientId
PatientInfo, CustomerApplicationPatient связаны, а customerApplicationPatientId - столбец внешнего ключа.
CustomerApplicationPatient связан с CustomerApplication, Пациентом с customerApplicationId, patientId как столбцами внешней клавиши.
Вопрос. Получите все записи PatientInfo, данные customerApplicationId и PatientId. Мой запрос - хороший запрос в том смысле, что он не создает слишком много внутренних объединений или кросс-соединений? Есть ли лучший способ сделать это?
Я очень ценю любую помощь и надеюсь, что вопрос ясен.
Спасибо, Шри
Вы не должны полагаться на неявные объединения, когда вам нужно ссылаться на них в своем предложении 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
Явные объединения будут переведены на точные заявления о соединении, которые вы ожидаете. Предыдущий запрос может быть не таким умным и может дважды присоединиться к одной и той же дочерней таблице.
sql
как он не содержит SQL.