2009-05-28 10 views
0

J'ai une requête HQL de travail que je veux optimiser. Il est comme suit:HQL requête équivalence: Pourquoi sont-ils différents

select distinct A.id from Import as A, Place D 
where (A.place=D or A.placeBOK=D) and D.country=? 

I tried to replcae the query from above by the following: 

select distinct A.id from Import as A 
where A.place.country=? or A.placeBOK.country=? 

En plus des performances, j'ai pensé que les deux requêtes sont équivalentes. Mais ils ne le sont pas. Le premier est la livraison d'un ensemble de 20 objets, alors que le second ne fournit que 14 objets.

Qu'est-ce que je fais mal?

Un conseil?

Répondre

1

[MISE À JOUR]

Vous devez vous réécrire la requête pour

select distinct A.id from Import as A LEFT JOIN A.place b LEFT JOIN A.placeBOK c 
where b.country=? or c.country=? 

Votre deuxième requête est un équivalent de:

select distinct A.id from Import as A INNER JOIN A.place b INNER JOIN A.placeBOK c 
where b.country=? or c.country=? 

Voir aussi:

14.4. Forms of join syntax

HQL prend en charge deux formes d'association: implicite et explicite.

Les requêtes présentées dans la section précédente utilisent toutes la forme explicite dans laquelle le mot clé join est explicitement utilisé dans la clause from. C'est le formulaire recommandé.

La forme implicite n'utilise pas le mot-clé join. Au lieu de cela, les associations sont "déréférencées" en utilisant la notation par points. Les jointures implicites peuvent apparaître dans n'importe laquelle des clauses HQL. La jointure implicite entraîne des jointures internes dans l'instruction SQL résultante.

from Cat as cat where cat.mate.name like '%s%' 
+0

Désolé, mais je ne comprends pas plutôt bien. Sont-ils équivalents ou non? – Luixv

+0

Je corrige ma réponse (j'espère que ce sera plus clair). Le point clé est que vous devez faire une jointure gauche à la place sur la jointure interne qui est un comportement implicite pour "." syntaxe. – FoxyBOA

0

Je ne comprends pas la réponse ci-dessus, mais vous pouvez peut-être essayer d'enquêter sur les 6 résultats qui sont issus de la requête A, mais pas de B requête ...