2011-05-12 214 views
2


我有兩個不同的機器上運行相同的代碼和相同的hbms每個都與nhibernate 3(一切都在一個源代碼庫和最新的版本檢查從那裏出來)和NHibernate生成不同的SQL查詢在每個機器nhibernate在兩臺不同的機器上爲同一個源生成兩個不同的查詢

SearchResult<Contact> searchResult = new SearchResult<Contact>(); 
      RepositoryLink<Contact> link = new RepositoryLink<Contact>(); 


       ICriteria icriteria = null; 
       var clientCriteria = DetachedCriteria.For<Contact>("c") 
             .CreateCriteria("ContactRoles","cr", NHibernate.SqlCommand.JoinType.InnerJoin) 
             .CreateCriteria("AclRole", "ar" ,NHibernate.SqlCommand.JoinType.InnerJoin) 
             .Add(Restrictions.Eq("ar.RoleName", RoleCode.Client)); 


      foreach (var keyValuePair in searchCriteria) 
      { 
       switch (keyValuePair.Key) 
       { 
        case SearchClientCriterion.Branch: 
         clientCriteria.CreateCriteria("c.BuEntries", "be" , NHibernate.SqlCommand.JoinType.InnerJoin) 
          .CreateCriteria("be.BuLevel","bl", NHibernate.SqlCommand.JoinType.InnerJoin) 
          .Add(Restrictions.Eq("bl.LevelNo", keyValuePair.Value)); 
         break; 
        case SearchClientCriterion.City: 
         clientCriteria.Add(Restrictions.Eq("c.City", keyValuePair.Value)); 
         break; 
        case SearchClientCriterion.ClientID: 
         clientCriteria.Add(Restrictions.Eq("c.ID", keyValuePair.Value)); 
         break; 
        case SearchClientCriterion.DOB: 
         break; 
        case SearchClientCriterion.FirstName: 
         clientCriteria.Add(Restrictions.Like("c.FirstName", keyValuePair.Value,MatchMode.Anywhere)); 
         break; 
        case SearchClientCriterion.LastName: 
         clientCriteria.Add(Restrictions.Like("c.LastName", keyValuePair.Value, MatchMode.Anywhere)); 
         break; 
        case SearchClientCriterion.State: 
         clientCriteria.Add(Restrictions.Eq("c.StateId", keyValuePair.Value)); 
         break; 
       } 
      } 

      if(buLevel > 0) 
       clientCriteria.CreateCriteria("c.BuEntries", "be", NHibernate.SqlCommand.JoinType.InnerJoin) 
         .CreateCriteria("be.BuLevel", "bl", NHibernate.SqlCommand.JoinType.InnerJoin) 
         .Add(Restrictions.Eq("bl.LevelNo", buLevel)); 


      var clientCountCriteria = (ICriteria)clientCriteria.GetExecutableCriteria(link.Session).Clone(); 
      searchResult.Count = clientCountCriteria.SetProjection(Projections.CountDistinct("c.ID")).UniqueResult<int>(); 


      icriteria = clientCriteria.GetExecutableCriteria(link.Session); 
      searchResult.Data = icriteria.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List<Contact>(); 

這是標準 這產生:

SELECT count(distinct this_.contactkey) as y0_ 
FROM [Contact] this_ 
     inner join [ContactRole] cr1_ 
     on this_.contactkey = cr1_.contactkey 
     inner join [AclRole] ar2_ 
     on cr1_.rolekey = ar2_.rolekey 
WHERE ar2_.rolename = 'C' /* @p0 */ 
     and this_.firstname like '%alex%' /* @p1 */ 

在一個機器和

SELECT count(distinct this_.contactkey) as y0_ 
FROM [Contact] this_ 
     left outer join [ContactRole] contactrol1_ 
     on this_.contactkey = contactrol1_.contactkey 
     left outer join [AclRole] aclrole2_ 
     on contactrol1_.rolekey = aclrole2_.rolekey 
WHERE this_.username like '%alex%' /* @p0 */ 
     and not (aclrole2_.rolename = 'C' /* @p1 */) 

有沒有人知道這是爲什麼?

+2

兩個版本都指向同一個數據庫,兩個版本的會話工廠配置是否相同? – Tomas 2011-05-12 13:39:21

回答

0

最後我重新創建了整個數據庫。刪除所有內容。重新創建它。 檢查了一切,現在它工作。

+0

問題已解決:-)但我希望知道真正的問題是什麼。 – Tomas 2011-05-13 07:47:17

+0

@Tomas我會喜歡那個 – Para 2011-05-13 12:34:58

0

你不正好有在配置的差異: 會話工廠

  <property name="use_outer_join">true</property> 

的差異可能是你的問題的原因。

+0

我有一個Web服務在調用者Web服務中調用另一個Web服務這個屬性確實存在我反正刪除了它。在被調用的Web服務中,該屬性不存在,但是這是生成上述2個查詢的Web服務。我不明白第一項服務中的設置會如何影響第二項服務。 – Para 2011-05-13 06:29:23

+0

@Para你提到了2個不同的機器來生成查詢。這兩個配置之間是否有任何不匹配? – Tomas 2011-05-13 07:05:21

+0

對我而言,NH 3.2中的屬性use_outer_join會產生錯誤,已棄用 - 已過時 – Kiquenet 2012-01-18 10:50:22

相關問題