2012-11-20 98 views
0

什麼是在NHibernate的語法(3.3版本)查詢(標準?)以下SQL語句:sql語句NHibernate的標準

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); 
+2

有幾種方法可以加入所有的NHibe rnate查詢方法。你嘗試過什麼嗎? –

+0

更新了原來的問題。 – user1838662

+0

是的,ICriteria上的CreateAlias()和CreateCriteria()會沿着映射的關聯創建連接,但是你顯示的條件代碼中的命名與SQL並不完全匹配,所以判斷是否有錯誤有點難。如果您試圖在沒有映射關聯的實體之間進行連接,那麼在HQL或LINQ中將更容易。 –

回答

0

我結束了這:

 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>(); 
0
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>();