2008-11-26 14 views
6

Mam tabelę z polem datownika typu datetime. Muszę zebrać dane między określonym czasem początkowym i końcowym w grupy x reprezentujące przedziały czasu o równej długości, gdzie x jest podane jako parametr funkcji.Grupa hibernacji według przedziału czasowego

Jaki byłby najlepszy sposób, aby to zrobić z Hibernacja?

EDIT: niektóre wyjaśnienia

mysql Tabela:

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

Podmiot klasa:

Calendar dataTs; 
Integer value1; 
BigDecimal value2; 
... 

szukam zapytania HQL że robi coś

select max(c.value1), avg(c.value2) from MyClass c 
    where c.dataTs between :start and :end group by <interval> 

gdzie kto Okres czasu jest zgrupowany w x równych odstępach czasu.

przykład:

Start : 2008-10-01 00:00:00 
End : 2008-10-03 00:00:00 (2 days) 
Groups: 32 

musiałyby być grupowane w odstępie czasu w ciągu 1,5 godziny (48 godzin/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 
... 

Odpowiedz

9

Próbowałem rozwiązać ten sam problem. Muszę pogrupować dane według przedziału 2 godzin w ciągu jednego dnia. W rzeczywistości "czysty" Hibernate nie powinien być używany w ten sposób. Dlatego dodałem natywną projekcję SQL do kryteriów Hibernate. W Twoim przypadku może to wyglądać tak (używam MySQL składni & funkcji):

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

Kod szuka trochę brzydki, ale to rozwiązuje problem. Mam nadzieję, że ogólny pomysł będzie dla Ciebie pomocny.

3

hibernacji do mapowania pomiędzy wykresem obiektów (żywe i typy wartości) i ich reprezentacja w relacyjnej bazie danych.

Z opisu pytania nie wymienia się żadnych elementów, które są modelowane, dlatego sugerowałbym pominięcie natywnego zapytania SQL.

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

Może gdybyś pisał strukturę tabeli, może dać więcej kontekstu za pytanie?