Nhibernate 多对多关系中带子句的标准API

Nhibernate 多对多关系中带子句的标准API,nhibernate,criteria,criteria-api,icriteria,Nhibernate,Criteria,Criteria Api,Icriteria,NHibernate 3适用于API标准。我试图用它来限制多对多关系上的连接,而NHibernate将附加的连接限制应用于链接表,而不是正确的表 玩家和地址之间存在多对多关系,我希望通过限制地址返回玩家及其邮寄地址。IsMailingAddress。在where子句中限制IsMailingAddress不会返回没有邮寄地址(或根本没有地址)的记录,因此我需要在join中限制它。下面的代码被简化了,我不能使用HQL 查询: var target = session.CreateCriteria&l

NHibernate 3适用于API标准。我试图用它来限制多对多关系上的连接,而NHibernate将附加的连接限制应用于链接表,而不是正确的表

玩家和地址之间存在多对多关系,我希望通过限制地址返回玩家及其邮寄地址。IsMailingAddress。在where子句中限制IsMailingAddress不会返回没有邮寄地址(或根本没有地址)的记录,因此我需要在join中限制它。下面的代码被简化了,我不能使用HQL

查询:

var target = session.CreateCriteria<Player>()
    .SetProjection(Projections.Property("PlayerId"))
    .CreateAlias("Addresses", "ad", JoinType.LeftOuterJoin, Restrictions.Eq("ad.IsMailingAddress", true))
    .Add(Restrictions.Eq("LastName", "Anonymous"))
   .List();
MailingAddressFlag(映射到IsMailingAddress的列)在不存在的多对多链接表中受到限制,LastName限制应用于地址表的联接中。确实会发出查询,但数据库服务器当然会引发异常

这是一个bug,不受支持还是我做错了?

var target=session.CreateCriteria()
var target = session.CreateCriteria<Player>()
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin)
    .Add(Restrictions.Eq("LastName", "Anonymous"))
    .Add(Restrictions.Eq("ad.IsMailingAddress",true))
    .List();
.CreateAlias(“地址”,“广告”,JoinType.InnerJoin) .Add(Restrictions.Eq(“LastName”、“匿名”)) .Add(Restrictions.Eq(“ad.IsMailingAddress”,true)) .List();
只需内部连接到邮件地址,并限制IsMailingAddress


应该将玩家(姓氏为“匿名”)带回他们的邮箱地址,其中他们有一个地址,该地址标记为IsMailingAddress。

解决方案如下。应该只有一个地址设置为IsMailingAddress,因此如果有一个或没有一个地址使用内部联接,则or条件允许联接成功

var target = session.CreateCriteria<Player>()
    .SetProjection(Projections.Property("PlayerId"))
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin)
    .Add(RestrictionsOr(Restrictions.Eq("ad.IsMailingAddress", true), Restrictions.IsNull("ad.AddressId")))
    .Add(Restrictions.Eq("LastName", "Anonymous"))
   .List();
var target=session.CreateCriteria()
.SetProjection(Projections.Property(“PlayerId”))
.CreateAlias(“地址”,“广告”,JoinType.InnerJoin)
.Add(RestrictionsOr(Restrictions.Eq(“ad.IsMailingAddress”),true),Restrictions.IsNull(“ad.AddressId”))
.Add(Restrictions.Eq(“LastName”、“匿名”))
.List();

我认为这是一个bug,但我找到了一个简单的解决方法。25分给第一个能看到森林的人。提示:播放机可以链接到多个地址,但其中只有一个地址是邮寄地址。如果没有地址或没有设置IsMailingAddress的地址,则不会返回播放机。第一个问题(没有行)很容易用左连接解决,第二个更难。我们的目标是将其邮寄地址(如果存在)返回给播放机,否则将以空地址返回播放机。播放机能否只有一个未标记为邮寄地址的地址?您是否有机会回答自己的问题,以便我了解您的解决方法?您使用的数据库是什么?你能发布SQL吗?
var target = session.CreateCriteria<Player>()
    .SetProjection(Projections.Property("PlayerId"))
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin)
    .Add(RestrictionsOr(Restrictions.Eq("ad.IsMailingAddress", true), Restrictions.IsNull("ad.AddressId")))
    .Add(Restrictions.Eq("LastName", "Anonymous"))
   .List();