我有一个表格,其中包含datetime类型的时间戳字段.我需要将定义的开始和结束时间之间的数据聚合成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
其中整个时间段被分组为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 ...
小智.. 9
我试图解决同样的问题.我必须在一天内按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();
代码看起来有点难看,但它解决了问题.希望总体思路对您有所帮助.
我试图解决同样的问题.我必须在一天内按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();
代码看起来有点难看,但它解决了问题.希望总体思路对您有所帮助.