2011-11-03 51 views
3

這是我的情景:NHibernate的QueryOver多個訂單通過與別名

public IEnumerable<ISuperMerc> getSuperMercTree(string IDLanguage) 
{ 

     SuperMercModel SMer = null; 
     SuperMercDescriptionModel descrSMer = null; 
     MercModel Merc = null; 
     MercDescriptionModel descrMerc = null; 

     var qOver = _HibSession.QueryOver<SuperMercModel>(() => SMer)      
       .JoinAlias(() => SMer.DescriptionsSM,() => descrSMer,JoinType.LeftOuterJoin) 
        .Where(() => descrSMer.IDLanguage == IDLanguage) 
       .JoinAlias(() => SMer.Merc,() => Merc,JoinType.LeftOuterJoin) 
        .JoinAlias(() => Merc.DescriptionsMer,() => descrMerc,JoinType.LeftOuterJoin) 
         .Where(() => descrMerc.IDLanguage == IDLanguage)  
       .OrderByAlias(() => SMer.ID).Asc 
       .ThenByAlias(() => descrMerc.Description).Asc 
       .Future<SuperMercModel>(); 

     return qOver; 

} 

我遇到了以下錯誤

無法解析屬性:說明:SuperMercModel

奇怪的是,Description字段位於MercDescriptionModel類中,不在SuperMercModel類中。

我正在使用別名來創建多聯接和多訂單查詢。

回答

1

我使用HQL 下面的代碼

public IEnumerable<ISuperMerc> getSuperMercTree(string IDLanguage) 
{ 
    string hql = string.Empty; 

    hql = "select SM from SuperMercModel SM" 
       + " left join fetch SM.DescriptionsSM DSM" 
       + " left join fetch SM.Merc ME" 
       + " left join fetch ME.DescriptionsMer DME" 
       + " where DSM.IDLanguage = :IDLanguage " 
       + " and DME.IDLanguage = :IDLanguage " 
       + " order by SM.ID asc, DME.Description asc"; 

      IQuery query = _HibSession 
       .CreateQuery(hql) 
       .SetString("IDLanguage ", IDLanguage); 

      IList<SuperMercModel> result = query.List<SuperMercModel>(); 


      return result; 
} 

我希望這是對別人有幫助的解決了這個問題。

+1

爲什麼要使用舊的方法? QueryOver沒有任何解決方案嗎? – whitestream

7

如果您將OrderByAliasThenByAlias更改爲常規OrderByThenBy子句,則您的原始代碼應該不使用SQL。我有同樣的問題,併爲我解決它。

+0

是的,OrderBy應該使用NOT OrderByAlias –

+0

這個。爲什麼地獄是方法的名稱「OrderByAlias」,如果它不按別名排序呢? – Th3B0Y