J'essaie d'écrire une requête NHibernate HQL qui utilise des parenthèses dans la clause where. Cependant, l'analyseur HQL semble ignorer ma parenthèse, changeant ainsi la signification de ma déclaration. Quelqu'un peut-il faire la lumière sur le sujet?Problème de logique NHibernate HQL
La requête HQL suivante:
from WebUser u left join fetch u.WebUserProfile left join fetch
u.CommunicationPreferences where (u.CommunicationPreferences.Email = 0 and
u.SyncDate is not null) or u.DateDeleted is not null
se traduit par:
from WebUser webuser0_
left outer join WebUserProfile webuserpro1_
on webuser0_.UserId = webuserpro1_.WebUserId
left outer join WebUserCommunicationPreferences communicat2_
on webuser0_.UserId = communicat2_.UserId
where communicat2_.Email = 0
and (webuser0_.SyncDate is not null)
or webuser0_.DateDeleted is not null
Merci
Jon
Merci KLE. Un peu plus d'informations, CommunicationPreferences.Email n'est jamais nul. Le problème est que les parenthèses ont été déplacées des deux premières conditions vers la condition intermédiaire, modifiant ainsi la sémantique de la requête – Jon
Je parle de la nullabilité de c.Email, mais c lui-même. Il peut être nul parce que vous écrivez une jointure à gauche. Cela signifie: s'il n'y a pas de ligne correspondante, remplacez toutes les valeurs par null. Ceci est incompatible avec toute sélection sur c.Email, ce qui a pour effet de NE PAS sélectionner une ligne c qui proviendrait de la partie externe. En résumé, la jointure externe et la sélection supplémentaire sont incompatibles. – KLE