2008-11-26 10 views
6

У меня есть таблица с полем времени типа datetime. Мне нужно агрегировать данные между определенным временем начала и конца в х-группы, представляющие временные интервалы равной длины, где х предоставляется как параметр функции.Hibernate group по времени

Что было бы лучшим способом сделать это с помощью Hibernate?

EDIT: некоторые пояснения

MySQL Таблица:

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

Entity Класс:

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> 

где кто le период времени сгруппирован в 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-часовому интервалу в течение одного дня. Фактически, «чистый» спящий режим не должен использоваться таким образом. Поэтому я добавил исходную версию 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(); 

код выглядит немного некрасиво, но это решает проблему. Надеюсь, что общая идея будет полезна для вас.

3

спящий режим для отображения между графа объектов (объекты и типы значений) и их представление в реляционной базе данных.

Из вашего описания вопроса вы на самом деле не упоминаете объекты, которые вы моделируете, поэтому я бы предложил отказаться от собственного SQL-запроса.

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

Может быть, если вы выложили структуру таблицы, это может дать больше контекста для вашего вопроса?

 Смежные вопросы

  • Нет связанных вопросов^_^