2008-11-26 17 views
6

Tengo una tabla con un campo de fecha y hora de tipo datetime. Necesito agregar los datos entre un tiempo definido de inicio y finalización en x grupos que representan intervalos de tiempo de igual longitud, donde x se proporciona como parámetro de función.Grupo Hibernate por intervalo de tiempo

¿Cuál sería la mejor manera de hacer esto con Hibernate?

EDIT: algunas explicaciones

MySQL Tabla:

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

Entidad clase:

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

Busco a una consulta HQL que hace algo como

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

donde quien El período de tiempo se agrupa en x intervalos de tiempo del mismo tamaño.

Ejemplo:

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

necesitaría ser agrupados por un intervalo de tiempo de 1,5 horas (48 horas/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 
... 

Respuesta

9

He tratado de resolver el mismo problema. Tengo que agrupar los datos en un intervalo de 2 horas dentro de un día. De hecho, se supone que Hibernate "puro" no debe usarse de esta manera. Así que agregué una proyección nativa de SQL a los criterios de Hibernate. Para su caso podría tener este aspecto (estoy usando la sintaxis de MySQL & funciones):

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

El código está buscando un poco feo, pero que resuelve el problema. Espero que la idea general te sea útil.

3

Hibernate es para el mapeo entre un gráfico de objetos (entidades y tipos de valor) y su representación en una base de datos relacional.

Según la descripción de su pregunta, realmente no menciona ninguna entidad que está modelando, por lo que le sugiero que descienda a una consulta SQL nativa.

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

Tal vez si usted fijó la estructura de la tabla, esto puede dar más contexto para su pregunta?

Cuestiones relacionadas