0

nHibernate3.3を使用しています。次のようにSQLを実行したいと思います。

select COUNT(*) from (
SELECT YEAR(MeasureDateLocal) As [Year], MONTH(MeasureDateLocal) As [MONTH], DAY(MeasureDateLocal) As [DAY], sum(this_.RainCounterValue) as y3_
FROM DriverPeriphMeasure this_
WHERE this_.IdDriver = @p1
GROUP BY YEAR(MeasureDateLocal), MONTH(MeasureDateLocal), DAY(MeasureDateLocal) ) s 

ただし、QueryOverまたはLINQを使用します。現在、私はこの醜いピースコードを持っています:

var countQuery = Context.Session.CreateSQLQuery(
    @"select COUNT(*) from 
    (SELECT YEAR(MeasureDateLocal) As [Year], MONTH(MeasureDateLocal) As [MONTH], DAY(MeasureDateLocal) As [DAY], sum(this_.RainCounterValue) as y3_ 
    FROM DriverPeriphMeasure this_ 
    WHERE this_.IdDriver = :driverID
    GROUP BY YEAR(MeasureDateLocal), MONTH(MeasureDateLocal), DAY(MeasureDateLocal) ) s" )
.SetParameter<Guid>( "driverID", driver );
int total = countQuery.UniqueResult<int>();

しかし、QueryOverを使用してそれを行う方法を知りたいです。私はなんとか次のQueryOverを作成することができました:

var q3 = Context.Session.QueryOver<DriverPeriphMeasure>().Where( x => x.Driver.Id == driver )
                    .SelectList( list => list
                        .Select( Projections.SqlGroupProjection( "YEAR(MeasureDateLocal) As [Year]", "YEAR(MeasureDateLocal)", new[] { "YEAR" }, new IType[] { NHibernateUtil.Int32 } ) )
                        .Select( Projections.SqlGroupProjection( "MONTH(MeasureDateLocal) As [MONTH]", "MONTH(MeasureDateLocal)", new[] { "MONTH" }, new IType[] { NHibernateUtil.Int32 } ) )
                        .Select( Projections.SqlGroupProjection( "DAY(MeasureDateLocal) As [DAY]", "DAY(MeasureDateLocal)", new[] { "DAY" }, new IType[] { NHibernateUtil.Int32 } ) )
                        );

しかし、それをサブクエリとして設定する方法が見つかりません。

4

1 に答える 1

2

現在、HQLでのみ実行できます。Andrew Whitakerが述べたように、NHはselectクラスのサブセレクトをサポートしていません。ただし、式を使用して、select句のsubselectをfrom句のsubselectに変換することは可能です。したがって、グループ化するには、副選択からmax(id)を選択する必要がありますが、in句でのSQLの制限として、1つの列のみを返す副選択を使用できます。

ただし、CriteriaおよびQueryOver APIでは、グループ化フィールドをselect句から除外することはできません(https://nhibernate.jira.com/browse/NH-1426) 。

そして、これはlinqでは実行できません。https://nhibernate.jira.com/browse/NH-3154とhttps://nhibernate.jira.com/browse/NH-3155の2つの問題があるためです

したがって、HQLでそれを行う最後のチャンスがあります。

var count = session.CreateQuery(
    @"select count(dm.Id) 
      from DriverPeriphMeasure dm 
      where dm.Id in (
          select max(dm1.Id) 
          from DriverPeriphMeasure dm1 
          where dm1.IdDriver = :? 
          group by date(dm1.MeasureDateLocal)
      )").UniqueResult();
于 2012-07-23T16:33:47.733 に答える