Могу ли я загрузить свойство с помощью HQL? - PullRequest
4 голосов
/ 10 сентября 2010

Я пытаюсь понять, как быстро загружать клиентов в следующем HQL-запросе:

select order.Customer
from Order as order
where order.Id in
(
  select itemId
  from BadItem as badItem
  where (badItemType = :itemType) and (badItem.Date >= :yesterday)
)

Между заказами и покупателями существуют обычные отношения "многие к одному".

Я хотел бы сделать это в запросе, в отличие от сопоставления, если это возможно - как в "выборке соединения ..."

Возможно, запрос будет реорганизован как объединение, и у меня возникнет ментальный блок.

Есть идеи?

1 Ответ

6 голосов
/ 10 сентября 2010
select customer
from BadItem as badItem
join fetch badItem.Order as order
left join fetch order.Customer as customer 
where (badItemType = :itemType) and (badItem.Date >= :yesterday)

Чтобы это работало, вам нужно добавить отношение между BadItem и Order, если BadItem не связано с Order, или использовать inner join с дополнительными условиями (следите за производительностью при использовании альтернативы 2).

Альтернатива:

select customer
from Order as order
join fetch order.Customer as customer
where order.Id in
(
  select itemId
  from BadItem as badItem
  where (badItemType = :itemType) and (badItem.Date >= :yesterday)
)

РЕДАКТИРОВАТЬ:

Как насчет:

select customer
from Order as order
join fetch order.Customer customer
join fetch customer.orders 
where order.Id in
(
  select itemId
  from BadItem as badItem
  where (badItemType = :itemType) and (badItem.Date >= :yesterday)
)
...