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.