6

日時型のタイムスタンプ フィールドを持つテーブルがあります。定義された開始時間と終了時間の間のデータを、同じ長さの時間間隔を表す x グループに集約する必要があります。ここで、x は関数パラメーターとして提供されます。

Hibernate でこれを行う最善の方法は何でしょうか?

編集:いくつかの説明

mysql テーブル:

data_ts: datetime pk
value1 : int
value2 : bigint
...

エンティティ クラス:

Calendar dataTs;
Integer value1;
BigDecimal value2;
...

次のようなHQLクエリを探しています

select max(c.value1), avg(c.value2) from MyClass c 
  where c.dataTs between :start and :end group by <interval>

ここで、期間全体が x 個の等しいサイズの時間間隔にグループ化されます。

例:

Start : 2008-10-01 00:00:00   
End   : 2008-10-03 00:00:00 (2 days)
Groups: 32

1.5 時間 (48 時間 / 32) の時間間隔でグループ化する必要があります。

2008-10-01 00:00:00 - 2008-10-01 01:29:59
2008-10-01 01:30:00 - 2008-10-01 02:59:59
2008-10-01 02:00:00 - 2008-10-01 04:29:59
...
4

2 に答える 2

9

私は同じ問題を解決しようとしました。1 日以内に 2 時間間隔でデータをグループ化する必要があります。実際、「純粋な」Hibernate はこのように使用されるべきではありません。そこで、Hibernate の基準にネイティブ SQL プロジェクションを追加しました。あなたの場合、次のようになります(私はMySQLの構文と関数を使用しています):

int hours = 2; // 2-hours interval

Criteria criteria = session.createCriteria( MyClass.class )
            .add( Restrictions.ge( "dataTs", start ) )
            .add( Restrictions.le( "dataTs", end ) );


ProjectionList projList = Projections.projectionList();
        projList.add( Projections.max( "value1" ) );
        projList.add( Projections.avg( "value2" ) );
        projList.add( Projections.sqlGroupProjection(
            String.format( "DATE_ADD( DATE( %s_.dataTs ), INTERVAL( HOUR( %s_.dataTs ) - HOUR( %s_.dataTs) %% %d ) HOUR) as hourly", criteria.getAlias(), criteria.getAlias(), criteria.getAlias(), hours ),
            String.format( "DATE_ADD( DATE( %s_.dataTs ), INTERVAL( HOUR( %s_.dataTs) - HOUR( %s_.dataTs ) %% %d ) HOUR)", criteria.getAlias(), criteria.getAlias(), criteria.getAlias(), hours ),
            new String[]{ "hourly" },
            new Type[]{ Hibernate.TIMESTAMP } )
        );
        criteria.setProjection( projList );

List results = criteria
            .setCacheable( false )
            .list();

コードは少し醜く見えますが、問題は解決します。一般的なアイデアが役立つことを願っています。

于 2008-11-26T21:49:06.463 に答える
3

Hibernate は、オブジェクト (エンティティと値の型) のグラフとリレーショナル データベースでのそれらの表現との間のマッピング用です。

質問の説明から、モデリングしているエンティティについて実際には言及していないため、ネイティブ SQL クエリにドロップダウンすることをお勧めします。

http://www.hibernate.org/hib_docs/reference/en/html/querysql.html

おそらくテーブル構造を投稿した場合、これはあなたの質問のより多くのコンテキストを提供するかもしれません?

于 2008-11-26T18:38:18.330 に答える