-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Problème sur une requète HQL
PostPosted: Thu Sep 29, 2005 5:15 pm 
Newbie

Joined: Thu Sep 29, 2005 4:17 pm
Posts: 2
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hibernate version: 3.0.5

voila mon problème (simplifié par les tables et colonnes dont j'ai seulement besoin), c'est sur une requète entre deux tables :
    La table A ayant pour colonnes (ID, B1_ID, B2_ID) sachant que B2_ID peut être NULL.
    La table B ayant pour colonnes (ID, REPERE)


TABLE A
ID | B1_ID | B2_ID
1 | 3 |
2 | 2 | 1
3 | 1 | 2

TABLE B
ID | REPERE
1 | XXXX
2 | YYYY
3 | ZZZZ

La table A est lié à une ou deux table(s) B.
j'ai donc mappé les deux tables en mettant deux liens many-to-one de la table A vers la table B, un NOT-NULL=true en passant par B1_ID et un NOT-NULL=false en passant par B2_ID.

Ainsi, quand je fais en HQL la requète suivante :
Code:
SELECT A.id FROM A
WHERE A.B1.repere = 'ZZZZ'

je recois bien l'id 1.
Pour :
Code:
SELECT A.id FROM A
WHERE A.B2.repere = 'ZZZZ'

Je ne recois aucun id ce qui est normal.
Mais pour :
Code:
SELECT A.id FROM A
WHERE A.B1.repere = 'ZZZZ' OR A.B2.repere = 'ZZZZ'

Je ne recois rien, je ne comprends par pourquoi je ne recois pas l'id 1 ?

En regardant le SQL généré j'ai vu qu'il fait :
Code:
SELET A.id FROM A, B B1, B B2
WHERE A.B2_ID = B2.ID AND A.B1_ID = B1.ID AND (B2.repere = 'ZZZZ OR B1.repere = 'ZZZZ')


Je pense qu'il plante eu niveau du
Code:
A.B2_ID = B2.ID


Comment je peux faire pour que ma requète fonctionne, est-ce un bug du HQL ?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 29, 2005 9:11 pm 
Newbie

Joined: Fri Sep 23, 2005 7:39 pm
Posts: 7
Hibernate fait les jointures qu'il doit faire puis il impose les conditions de la clause where.
Il faudrait une jointure externe gauche pour que cela fonctionne.

Une première idée serait de faire :

Code:
SELECT a.id
FROM A as a
    left join a.B1 as b1
    left join a.B2 b2
WHERE b1.repere = 'ZZZZ' OR b2.repere = 'ZZZZ'


rappel sur les jointures gauche
Dans une jointure gauche, s'il n'y a pas d'enregistrements dans la table jointe (celle de doite, b1 ou b2 ici), les enregistrements de la table de gauche sont quand même retournés.

Un exemple pour clarifier:
Une table A contenant l'id d'un produit, et une table B de référence contenant l'id desproduits avec le libellé.
Tu cherche dans A en faisant des restriction et tu fais une jointure externe gauche pour avoir les libellés dans une seule requête.
Avec une jointure normale, si un produit a été effacé du référentiel (de B), l'enregistrement de A ayant cet id de produit ne sera pas retourné. Avec la jointure externe gauche, il sera retourné, mais le libellé sera vide (ou null).

Appliquons ces connaissances à la requête proposée.
Déjà, la différence est que l'on restreint, dans la clause where, au niveau des tables de droite.
La requête va donc retourner tous les enregistrements de A, puis les filtrer en fonction des critères sur b1 et b2. On devrait donc avoir le résultat escompté.

Inconvénient
La requête risque de ne pas être performante car on retourne l'ensemble des enregistrements de A avant de les filtrer un à un. Cela convient si A ne contient qu'un petit nombre d'enregistrements. A vérifier, car je ne suis pas certain de ce que je dis.


J'espère que cela aura aidé un peu.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 30, 2005 6:23 am 
Newbie

Joined: Thu Sep 29, 2005 4:17 pm
Posts: 2
Super ça marche nikel !

en gros j'ai généré ma requète pour qu'elle me fasse un left join entre les tables ça me donne la requète suivante pour mon exemple du dessus :

Code:
SELECT a.id FROM A a
left join a.B1
left join a.B2
WHERE a.B1.repere = 'ZZZZ' OR a.B2.repere = 'ZZZZ'


ça me renvoie bien les bons résultats attendus merci beaucoup.
a+


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.