【问题标题】:sql statement to nhibernate criteria用于休眠条件的 sql 语句
【发布时间】:2012-11-20 13:08:28
【问题描述】:

以下 SQL 语句的 nhibernate(3.3 版)查询(标准?)中的语法是什么:

SELECT DISTINCT usr.* FROM User usr, User_SecurityGroup grp, SecurityGroup_Permission prm, Permission org 
WHERE usr.Id = grp.User_id AND grp.SecurityGroup_id = prm.SecurityGroup_id AND org.Id = prm.Permission_id 
AND org.Site_id IN (1,2,3) AND org.PermRead = 1 AND usr.Active = 1 AND org.Active = 1;

我不确定如何在表之间完成连接以及完成此类任务的条件语法。

对于此特定查询,将传入站点 ID 列表

还有条件“org.PermRead = 1”,属性名称将是动态的。所以它可能是“PermWrite”。

编辑: 好的,这就是我目前所拥有的

        ICriteria criteria = this.Session.CreateCriteria<User>();

        criteria.Add(Restrictions.In("User.Site", siteList.ToArray()));
        criteria.Add(Restrictions.Eq("User.Active", true));
        criteria.Add(Restrictions.Eq("Site.Active", true));
        criteria.Add(Restrictions.Eq(Enum.GetName(typeof(Perm.Types), access), true));

        criteria.SetResultTransformer(Transformers.DistinctRootEntity);
        return criteria.List<User>();

我认为加入的格式如下:

        criteria.CreateAlias("Sites", "Sites", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 

【问题讨论】:

  • 有几种方法可以加入所有 NHibernate 查询方法。你有没有尝试过?
  • 更新了原来的问题。
  • 是的,CreateAlias() (和 ICriteria 上的 CreateCriteria() 将沿着映射的关联创建连接。但是您显示的标准代码中的命名与 SQL 不太匹配,因此有点难以判断如果有任何问题。请注意,如果您尝试在没有映射关联的实体之间加入,在 HQL 或 LINQ 中会更容易。
  • 我很确定命名不正确,因此我需要指导。如何使用 createalias 完成多对多映射?模型上的字段名称是否用于 createalias 中的第一个参数?不确定您所说的映射关联是什么意思,但是所有模型都有流畅的映射来指定引用/具有许多关系。
  • 您是否阅读过 NHibernate 参考的第 15.4 节 (nhforge.org/doc/nh/en/index.html#querycriteria-associations)?它有一些简单的例子。是的,CreateAlias() 的第一个参数是条件所在实体上的映射属性或字段的名称(或使用“alias.proeperty”)。关联是使用例如映射的关联。 FluentNH 语法中的 References() 和 HasMany()。我的意思是这些字符串似乎并不都等同于 SQL - 例如。 SQL 中没有明显的“站点”概念,所以我不知道它对应的是什么。

标签: c# sql nhibernate


【解决方案1】:
ICriteria criteria = Session.CreateCriteria<User>()
    .Add(Restrictions.Eq("Active", true))
    .CreateCriteria("Sites", "Site"); 
        .Add(Restrictions.In("Id", siteList.ToArray()))
        .Add(Restrictions.Eq("Active", true))
        .Add(Restrictions.Eq(access.ToString(), true))

return criteria.List<User>();

【讨论】:

    【解决方案2】:

    我最终得到了这个:

           ICriteria criteria = Session.CreateCriteria<User>()
                .CreateAlias("SecurityGroups", "SecurityGroups")
                .CreateAlias("SecurityGroups.Permissions", "Permissions")
                .Add(Restrictions.Eq("Permissions.Active", true))
                .Add(Restrictions.Eq("Active", true))
                .Add(Restrictions.In("Permissions.Site", ids.ToArray()))
                .Add(Restrictions.Eq("Permissions.Perm" + Enum.GetName(typeof(Perm.Types), accessRight), Perm.Level.Allow));
            return criteria.List<User>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      相关资源
      最近更新 更多