Я наглядно покажу проблему, используя отличный пример ответа Джеймса и добавив альтернативное решение.
Когда вы выполните следующий запрос, без FETCH
:
Select e from Employee e
join e.phones p
where p.areaCode = '613'
Вы получите следующие результаты от Employee
, как и ожидали:
EmployeeId | EmployeeName | PhoneId | PhoneAreaCode
1 | James | 5 | 613
1 | James | 6 | 416
Но когда вы добавите слово FETCH
в JOIN
, вот что произойдет:
EmployeeId | EmployeeName | PhoneId | PhoneAreaCode
1 | James | 5 | 613
Сгенерированный SQL одинаков для двух запросов, но Hibernate удаляет в памяти регистр 416
при использовании WHERE
в соединении FETCH
.
Так, чтобы привести все телефоны и для правильного применения WHERE
, необходимо иметь два JOIN
s: один для WHERE
и другой для FETCH
.Как:
Select e from Employee e
join e.phones p
join fetch e.phones //no alias, to not commit the mistake
where p.areaCode = '613'