我想写一个NHibernate的HQL查询,在where子句中使用括号。但是,HQL解析器似乎忽略了我的括号,从而改变了我的陈述的含义。任何人都可以就此事阐明任何事情吗?NHibernate的HQL逻辑问题
以下HQL查询:
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
翻译为:
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
感谢
乔恩
感谢KLE。多一点信息,CommunicationPreferences.Email不会为空。问题是,括号已经从周围的前两个条件转移到围在中间状态,从而改变了查询 – Jon 2009-08-17 13:18:38
我谈论c.Email的空性的语义,但C本身。它可以为空,因为你写了一个左连接。这意味着:如果没有相应的行,则用空值替换所有值。这与c.Email上的任何选择都不兼容,因为它没有选择来自外部的任何c行。总之,外连接和进一步选择是不兼容的。 – KLE 2009-08-20 14:54:40