当前位置:  开发笔记 > 编程语言 > 正文

Hibernate组按时间间隔

如何解决《Hibernate组按时间间隔》经验,为你挑选了1个好方法。

我有一个表格,其中包含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();

代码看起来有点难看,但它解决了问题.希望总体思路对您有所帮助.



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();

代码看起来有点难看,但它解决了问题.希望总体思路对您有所帮助.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有