2010-09-10 14 views
3

Je suis en train de travailler comment les clients désireux charge dans la requête HQL suivante:Puis-je charger une propriété avec 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) 
) 

Il y a beaucoup d'habitude à une relation entre les commandes et les clients.

Je voudrais faire est dans la requête, par opposition à la mise en correspondance, si possible - comme dans « join fetch ... »

Peut-être que la requête serait comme une jointure remaniée avec et je J'ai un blocage mental.

Des idées?

Répondre

5
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) 

Pour que cela fonctionne, vous devrez ajouter la relation entre BadItem et ordonnance BadItem est sans rapport avec à l'ordre, ou d'utiliser un inner join avec des conditions supplémentaires (attention aux performances lors de l'utilisation de remplacement 2).

Alternative:

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) 
) 

EDIT:

Qu'en est-:

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) 
) 
+0

Merci pour l'aide. J'essaie d'abord votre requête "alternative", mais j'obtiens une "extraction de jointure de requête spécifiée, mais le propriétaire de l'association récupérée n'était pas présent dans l'erreur de liste de sélection". Des idées? Je vais essayer votre première suggestion une fois que je peux travailler sur la façon de mapper BadItem et Order (la clé dans la table BadItems est effectivement trois colonnes - pas ma conception). – dommer

+0

Hmm, On dirait que la raison est que si vous sélectionnez les clients, ils seront déjà peuplés. Cela signifie donc essentiellement que vos questions sont sans intérêt. Si vous sélectionnez directement les clients, les clients ne peuvent pas être paresseux (hibernate ne supporte pas le chargement paresseux au niveau de l'attribut) et sont donc déjà chargés. Cela pourrait-il être cela? –

+0

On l'aurait pensé, mais ma requête originale lance une exception LazyInitializationException pour Customer._orders (_orders est le champ de support de la propriété Order). – dommer