2011-12-05 6 views
2

Iは、SQLエラーを生成しているNHibernateのQueryOverを有するがスローこの問題は、私が選択するために使用しているSQLプロジェクションによって引き起こされています。投影自体はSQL関数を使用するため、パラメータ(定数:スペース)を持ちます。NHibernateは3.0 QueryOverは、はっきりと順序と同一の投影を使用すると、SQLエラー

NHは変数に割り当てられた投影法を使用すると、この変数の使用をそれぞれsqlに一意に変換します。つまり、それぞれ独自の新しいsqlパラメータを取得します。したがって、SQLは文が異なると考えます。私は、プロジェクションのエイリアスを使って無駄にしようとしましたが、QueryOverでこれを行う方法はないようです。

Criteria APIに戻す以外のアイデアに欠けているビット。

これは簡略化されQueryIOverコードです:以下のSQLで

var projection = ContactOrCompanyName(); 
    return Session.QueryOver<Contact>() 
    .Select(
     Projections.Distinct(
     Projections.ProjectionList() 
      .Add(Projections.Property<Contact>(x => x.Id).As("ContactId")) 
      .Add(projection) 
     ) 
    ) 
    .TransformUsing(Transformers.AliasToBean<ContactDto>()) 
    .OrderBy(projection).Asc; 

private IProjection ContactOrCompanyName 
    { 
     get 
     { 
     return Projections.SqlFunction(
      "coalesce", 
      NHibernateUtil.String, 
      Projections.Property<Contact>(c => c.CompanyName), 
      Projections.SqlFunction(
      "concat", 
      NHibernateUtil.String, 
      Projections.Property<Contact>(c => c.FirstName), 
      Projections.Constant(" "), 
      Projections.Property<Contact>(c => c.LastName) 
     ) 
     ); 
     } 
    } 

結果:

SELECT distinct 
this_.CONTACT_ID as y0_, 
coalesce(this_.COMPANY_NM, ([email protected]+this_.LAST_NM)) as y1_ 
FROM dbo.ADD_CONTACT this_ 
ORDER BY coalesce(this_.COMPANY_NM, ([email protected]+this_.LAST_NM)) asc 

基準APIは、この例で行くエイリアスの再利用をサポートするように見えるん:

IList results = session.CreateCriteria(typeof(DomesticCat), "cat") 
    .CreateAlias("kittens", "kit") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("cat.Name"), "catName") 
     .Add(Projections.Property("kit.Name"), "kitName") 
    ) 
    .AddOrder(Order.Asc("catName")) 
    .AddOrder(Order.Asc("kitName")) 
    .List(); 

それでは、QueryOverはどこですか?

答えて

3

これは少しハッキリですが、機能します。比較用と選択用の2つの投影を作成することで、選択リストに含まれていない投影による順序について不平を言うSQLを停止することができます。

関連する問題