我正在尝试使用ICriteria创建一个具有联接条件的查询。我尝试生成的SQL应该如下所示
SELECT c.ClientID
FROM Client c
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID AND
t.ContactType = 'Email'如果我使用像这样的标准
m_ClientRepository.QueryAlias("client")
.CreateCriteria("client.Contacts", "c", JoinType.LeftOuterJoin)
.Add(Restrictions.Eq("c.ContactType", ContactType.Email));它将生成我不想要的sql。
SELECT c.ClientID
FROM Client c
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID
WHERE t.ContactType = 'Email'如果ICriteria是不可能的,有没有办法用ICriteria或HQL来做到这一点?
编辑:我发现nHibernate 2.1 (我正在使用的)现在支持allow this。虽然对ICriteria不太确定,但这是我的偏好。
发布于 2011-09-01 06:59:09
我发现在NHibernate 3及之前版本中,唯一的方法就是像在this example中那样使用过滤器
在NHibernate 3.1中,现在以更好的方式支持这一点,即https://nhibernate.jira.com/browse/NH-2190
发布于 2011-08-29 15:06:29
我不会这么做的。左外连接让NH加载客户端,电子邮件联系人的筛选器将只加载电子邮件联系人...直到它初始化contact集合并加载所有内容。
如果它只加载E-Mail联系人,那么它将在内存中以不完整的对象结束。这通常不是一个好主意,特别是当您还在同一事务中更改数据时。
在您的情况下,我会尝试直接加载EMail联系人,并从联系人导航到客户。
session.CreateCriteria(typeof(Contact))
.Add(Restrictions.Eq("c.ContactType", ContactType.Email));发布于 2011-08-29 14:36:24
如果您找不到一种方法来形成正确的join,您可以使用一个简单的技巧:只需将您的限制设置为WHERE t.ContactType = 'Email' OR t.ClientID IS NULL -希望可以使用NHibernate。
https://stackoverflow.com/questions/1325188
复制相似问题