2010-01-14 10 views
28

Próbuję uzyskać raport za pomocą kryteriów i ProjectionList i jestem całkiem nowy przy użyciu tego poprzez hibernację. Więc mam ten model:Grupa według miesięcy z kryteriami Hibernate

private Long _userId; 

private Category _category; 

private Long _companyId; 

private Double _amount; 

private Date _date; 

I budowania kwerendy przy użyciu to:

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

} 

Zasadniczo metoda ta otrzyma kategorię i userid filtrowania płatności rekordy i okres, który wskaże ile miesięcy od teraz do końca chcę sumować. Jak mogę uzyskać sumę wyniku pogrupowaną według miesięcy?

Każda pomoc lub napiwek doceniam to!

Odpowiedz

37

Znalazłem odpowiedź i jest całkiem prosta. Zmieniono "groupProperty" w kryterium ProjecastList:

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

OK. Wyjaśnię sqlGroupProjection. Pierwszy parametr jest elementem po zapytaniu z „wybierz”, np

Select [firstPartOfSqlGroupProjection] * boo; 

Stała „{ps}” jest alias stan hibernacji zastosowanie w zapytaniu w odniesieniu do tabeli.

Drugi argument funkcji sqlGroupProjection to grupa według kryteriów, trzeci argument to nazwy kolumn, które otrzymasz od grupy, a na końcu rodzaj danych, których będziesz używać.

+3

Jak obsługiwać różne DB? takie jak MSSQL i Oracle? jako Oracle używać to_char i mssql używać weeknum ... – zolibra

0

Można użyć sqlquery w hibernacji, oto przykład:

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 -- 
}