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はどこですか?