2010-01-14 25 views
28

Estoy tratando de obtener un informe usando Criteria y ProjectionList, y estoy bastante nuevo usando esto a través de Hibernate. Así que tienen este modelo:Grupo por mes con criterios en Hibernate

private Long _userId; 

private Category _category; 

private Long _companyId; 

private Double _amount; 

private Date _date; 

Y la construcción de la consulta utilizando la siguiente:

public List sumPaymentsByUserCategoryPeriod(Category category, Long userId,Integer period){ 
    GregorianCalendar from = new GregorianCalendar(); 
    from.add(Calendar.MONTH, -period); 
    List<CategoryAmount> resultDTO= new ArrayList<CategoryAmount>(); 

    Criteria criteria = getSession().createCriteria(Payment.class); 
    criteria.add(Restrictions.eq("_category", category)); 
    criteria.add(Restrictions.eq("_userId",userId)); 
    criteria.add(Restrictions.between("_date", from.getTime(), new Date())); 

    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.sum("_amount")); 
    projectionList.add(Projections.groupProperty("_date")); 
    criteria.setProjection(projectionList); 
    return criteria.list(); 

} 

Básicamente este método reciben una categoría y un ID de usuario para filtrar los pagos de registros y un punto, que le indicará cuántos meses a partir de ahora quiero resumir. ¿Cómo puedo obtener el resultado de la suma agrupada por meses?

Cualquier ayuda o consejo Lo agradeceré!

Respuesta

37

Encontré la respuesta, y es bastante simple. He cambiado el "groupProperty" en los criterios para este ProjectionList:

projectionList.add(Projections.sqlGroupProjection(
    "month({alias}.DATE) as month, year({alias}.DATE) as year", 
    "month({alias}.DATE), year({alias}.DATE)", 
    new String[]{"month","year"}, 
    new Type[] {Hibernate.DOUBLE})); 

bien. Explicaré el sqlGroupProjection. El primer argumento es la parte de la consulta después de la "seleccionar", por ejemplo:

Select [firstPartOfSqlGroupProjection] * boo; 

el "alias {}" es el alias que hiberna uso en la consulta para hacer referencia a una tabla.

El segundo argumento de la función sqlGroupProjection es el grupo por criterios, el tercer argumento son los nombres de columnas que obtendrá del grupo y, finalmente, el tipo de datos que usará.

+3

Cómo manejar diferentes DB? como MSSQL y Oracle? como Oracle use to_char y mssql use weeknum ... – zolibra

0

Puede utilizar un SQLQuery en hibernación, aquí está un ejemplo:

public List<MonthlyPoint> groupByMonth(ChartRequest request){ 

    SQLQuery query = getSession().createSQLQuery("SELECT \n" + 
     "sum(this_.amount) as amount, \n" + 
     "extract(month from this_.fecha) as month, \n" + 
     "extract(year from this_.fecha) as year\n" + 
     "FROM jornada this_ \n" + 
     "GROUP BY \n" + 
     "month, \n" + 
     "year \n" + 
     "ORDER BY \n" + 
     "year asc, \n" + 
     "month asc"); 

     query.setResultTransformer(Transformers.aliasToBean(MonthlyPoint.class)); 
     return query.list(); 
} 


public class MonthlyPoint { 
    private Double year; 
    private Double month; 
    private Double amount; 
    //-- getters and setters here -- 
} 
Cuestiones relacionadas