我有一张表,其中的时间戳记字段为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 <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
...
Best Answer-推荐答案
我试图解决同样的问题。我必须在一天之内按2小时间隔对数据进行分组。实际上,不应以这种方式使用“纯” Hibernate。因此,我在Hibernate的条件中添加了 native 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();
该代码看起来有些丑陋,但可以解决问题。希望总体思路对您有所帮助。
关于java - hibernate 时间间隔分组,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/321687/
|