1

基準:

var subQuery = DetachedCriteria.For<RecordInfo>();
    .Add(Restrictions.Eq("Property1", "some string"))
    .Add(Restrictions.EqProperty("Property2", "record.Id"))
    .SetProjection(Projections.Max("Id"));

var criteria = session.CreateCriteria(typeof(Record), "record")
    .CreateAlias("record.ListOfRecordInfo", "recordInfo")
    .Add(Subqueries.PropertyEq("recordInfo.Id", subQuery));

Sybase ASE 15.5 ダイアレクトの場合、次のようなものが生成されます。

SELECT this_.Record_Id as Record1_2_3
...
FROM Record this_
INNER JOIN Record_Info Record_Info_
ON this_.Record_Id = Record_Info_.Property_2
WHERE Record_Info_.Record_Info_Id = 
(
    SELECT max(this_0_.Record_Info_Id) as y0_
    FROM Record_Info this_0_
    WHERE this_0_.Property_1 = @p0
    AND this_0_.Property_2 = this_.Record_Id
)

問題は、生成された as y0_ です。Sybase は、使用しているバージョンの Sybase のサブクエリのエイリアスを許可していません。

NHibernate がサブクエリのエイリアスを生成しないようにクエリを変更するにはどうすればよいですか?

4

1 に答える 1

1

カスタム SQL ステートメントを使用して、サブクエリの射影を調整できます。したがって、代わりに:

var subQuery = DetachedCriteria.For<RecordInfo>(); 
    ...
    .SetProjection(Projections.Max("Id")); // instead of this

できるよ:

var subQuery = DetachedCriteria.For<RecordInfo>(); 
    ...
    .SetProjection(Projections.SqlProjection(" MAX(RecordInfoId) " // use this
      , new string[] {"ID"}
      , new IType[] {NHibernate.NHibernateUtil.Int32}));

IdNHibernate Property-to-Column ( to )をスキップしているため、列名を使用する必要がありますRecordInfoId

これにより、

  • SELECT max(this_0_.Record_Info_Id) as y0_それを
  • SELECT MAX(RecordInfoId)(カスタム SQL)
于 2013-01-30T08:11:32.113 に答える