我有以下结构。
消息(文字)
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为我的查询添加授权过滤)
答案 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对象的一个副本。