NHibernate:没有关联的LeftOuterJoin

时间:2010-10-31 20:31:12

标签: nhibernate

我有以下结构。

消息(文字)

MessageReading(消息,用户)

如果是,我想加载带有相应MessageReading的邮件 存在。 我可以通过HQL实现这一点:

var query = session.CreateSQLQuery( 
@"SELECT {msg.*}, {mr.*} 
  FROM Message msg 
  LEFT OUTER JOIN MessageReading mr ON (mr.Message_Id = msg.Id  AND 
  mr.User_Id = :user)") 
.AddEntity("msg", typeof(Message)) 
.AddEntity("mr", typeof(MessageReading)) 
.SetParameter("user", user.Id);

有没有办法对Criteria API做同样的事情? (我需要它,因为我 使用Rhino Security为我的查询添加授权过滤)

1 个答案:

答案 0 :(得分:1)

首先,在您的示例中,您使用RDBMS的基础方言执行SQL查询,而不是HQL查询。这就是为什么你能够在NHibernate配置中没有关联映射的情况下进行连接。要执行HQL查询,您可以使用session.CreateQuery方法。

要使用HQL或Criteria API执行此查询,您需要从Message类到MessageReading类的一对多<set name="Readings" ...>映射。 Message类应具有Readings类型的ISet<MessageReading>属性。 有了这个映射,您就可以使用Criteria API,如下所示:

var criteria = session.CreateCriteria<Message>);
criteria.CreateAlias("Readings", "mr", JoinType.LeftOuterJoin);
criteria.Add(Restrictions.Eq("User", user));
criteria.SetResultTransformer(Transformers.DistinctRootEntity);

var results = criteria.List<Message>();

这将返回Message对象列表,并在每个对象上填充Readings属性。 DistinctRootEntity转换器确保即使有多个MessageReadings,也只返回每个Message对象的一个​​副本。