NHibernate查询字典的关键字段(map)

时间:2010-05-04 22:20:00

标签: nhibernate

我有一个对象模型,其中Calendar对象有一个名为UserPermissions的IDictionary<MembershipUser, Perms>,其中MembershipUser是一个对象,而Perms是一个简单的枚举。这是日历的映射文件

<map name="UserPermissions" table="CalendarUserPermissions" lazy="true" cascade="all">
  <key column="CalendarID"/>
  <index-many-to-many class="MembershipUser" column="UserGUID" />
  <element column="Permissions" type="CalendarPermission" not-null="true" />
</map>

现在我想执行一个查询来查找给定用户已定义某些权限的所有日历。许可是无关紧要的;我只想要一个日历列表,其中给定用户作为UserPermissions字典中的键存在。我有username属性,而不是MembershipUser对象。如何使用QBC(或HQL)构建它?这是我尝试过的:

ISession session = SessionManager.CurrentSession;
ICriteria calCrit = session.CreateCriteria<Calendar>();
ICriteria userCrit = calCrit.CreateCriteria("UserPermissions.indices");
userCrit.Add(Expression.Eq("Username", username));
return calCrit.List<Calendar>();

这构造了无效的SQL - WHERE子句按预期包含WHERE membership1_.Username = @p0,但FROM子句不包含MemberhipUsers表。

另外,我真的不得不努力学习.indices符号。我通过挖掘NHibernate源代码找到了它,并看到还有.elements和其他一些点缀符号。哪里是对关联路径的允许语法的引用?我觉得上面的内容非常接近,只是遗漏了一些简单的东西。

1 个答案:

答案 0 :(得分:2)

我自己尝试这样做,看起来这可以通过HQL而不是Criteria API完成。

https://nhibernate.jira.com/browse/NH-1795

在HQL中执行此操作:

http://ayende.com/Blog/archive/2009/06/03/nhibernate-mapping-ndash-ltmapgt.aspx

特别关注Ayende的评论:

它是这样的: 从Profile p join p.Entries e中选择1 其中index(e)='HasCats'和e ='true'