nHibernate 使用 Criteria API 进行多对多查询

5

在提问之前,我查看了所有与这个主题相关的帖子。

我还阅读了这篇博客文章:http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx

我有团队和成员,它们之间存在多对多关系。

基本上:成员 -> 成员团队 <- 团队

我的查询尝试获取所有属于查询成员所属团队的成员(包括查询成员)。

我使用以下 FluentHibernate 创建了我的表:

TeamMap 代码:

Id(x => x.ID).GeneratedBy.GuidComb().UnsavedValue("00000000-0000-0000-0000-000000000000");

HasManyToMany(x => x.Members)
    .Table("MemberTeam")
    .ChildKeyColumn("TeamID")
    .ParentKeyColumn("MemberID");

MemberMap 代码:

Id(x => x.ID).GeneratedBy.GuidComb().UnsavedValue("00000000-0000-0000-0000-000000000000");

HasManyToMany(x => x.Teams)
    .Table("MemberTeam")
    .ChildKeyColumn("MemberID")
    .ParentKeyColumn("TeamID");

我用以下代码进行查询:

DetachedCriteria dCriteria = DetachedCriteria.For(typeof(Team), "team")
    .SetProjection(Projections.Id())
    .Add(Property.ForName("team.ID").EqProperty("mt.ID"));

ICriteria criteria = Session.CreateCriteria(typeof (Member), "member")
    .CreateAlias("Teams", "mt")
    .Add(Subqueries.Exists(dCriteria))
    .Add(Restrictions.Eq("mt.MemberID", new Guid(memberID)));

IList<Member> list = criteria.List<Member>();

我知道我做错了什么,但是我不明白是什么

任何帮助都将不胜感激

非常感谢!

P.S. 我的地图似乎没问题,我可以正常保存对象!

1个回答

4
通过调用CreateAlias来为Teams路径建立别名,NHibernate将会自动为您连接适当的表格。不需要在成员ID上进行子查询:
var members = session
    .CreateCriteria<Member>("member")
    .CreateAlias("Teams", "mt")
    .List<Member>();

然而,你甚至没有使用别名,所以你可能更喜欢急切地获取团队:

var members = session
    .CreateCriteria<Member>("member")
    .SetFetchMode("Teams", FetchMode.Eager)
    .List<Member>();

这样做可以确保在访问每个MemberTeams集合时不会再次访问数据库。

谢谢您...思考了几个小时后,我得到了相同的答案 :) - Daniil Harik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接