【问题标题】:Hibernate group by time interval按时间间隔休眠组
【发布时间】:2010-09-24 05:10:12
【问题描述】:

我有一个带有日期时间类型的时间戳字段的表。我需要将定义的开始时间和结束时间之间的数据聚合到代表等长时间间隔的 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
...

【问题讨论】:

    标签: java mysql hibernate group-by


    【解决方案1】:

    我试图解决同样的问题。我必须在一天内按 2 小时的间隔对数据进行分组。事实上,“纯”Hibernate 不应该以这种方式使用。所以我将原生 SQL 投影添加到 Hibernate 的标准中。对于您的情况,它可能看起来像这样(我使用的是 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 用于在对象图(实体和值类型)与其在关系数据库中的表示之间进行映射。

      根据您的问题描述,您并没有真正提及您正在建模的任何实体,因此我建议您直接使用原生 SQL 查询。

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

      也许如果您发布了表格结构,这可能会为您的问题提供更多背景信息?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2014-12-12
        • 2014-03-25
        • 2011-02-08
        • 2019-06-28
        • 2018-10-12
        • 2011-08-24
        相关资源
        最近更新 更多