2009-05-29 17 views
3

Ich versuche, einige Zeilen mit HQL Monat für Monat zu gruppieren, aber ich bin irgendwie neu zu dieser API und kann nicht scheinen, es zur Arbeit zu bekommen.HQL: Gruppe nach Monat

Hier ist mein Code:

 Criteria query = getHibernateSession().createCriteria(SalesPerformance.class); 

     // summary report is grouped by date 
     query.setProjection(Projections.projectionList().add(
       Projections.groupProperty("effectiveDate"), "effectiveDate").add(
       Projections.groupProperty("primaryKey.seller", "seller").add(
       Projections.sum("totalSales")))); 


     // sub-select based on seller id 
     query.add(Property.forName("primaryKey.seller.id").eq(sellerId)).setFetchMode(
       "primaryKey.seller", FetchMode.SELECT); 

     query.add(Property.forName("primaryKey.effectiveDate").le(new Date())); 
     query.add(Property.forName("primaryKey.effectiveDate").ge(DateUtils.truncate(new Date(), Calendar.MONTH))); 
     query.addOrder(Order.desc("primaryKey.effectiveDate")); 

     return query.list(); 

Mein Problem mit dieser Abfrage ist, dass es eine Zeile pro Tag zurück geht, wenn ich wegen Projections.groupProperty eine Zeile pro Monat benötigen („effectiveDate“).

Ich dachte über die Verwendung von Projections.sqlGroupProjection anstelle von Projections.groupProperty und werfen einige HQL, aber die Dokumentation und die paar Beispiele, die ich gefunden habe, nicht wirklich helfen, zu verstehen, wie ich gehen würde die richtige postresql-Anweisung darin Methode.

Jeder, der sich mit Postgres und HQL auskennt, könnte hier einige Hinweise geben?

+1

Dies verwendet nicht Hibernate HQL, dies verwendet die Kriterien von Hibernate. Es sollte nicht als HQL markiert werden. – James

Antwort

6

die Lösung gefunden:

Criteria query = getHibernateSession().createCriteria(SalesPerformance.class); 

    // summary report is grouped by date 
      query.setProjection(Projections.projectionList().add(Projections.sqlGroupProjection("date_trunc('month', eff_dt) as eff_dt_value", "eff_dt_value", new String[] {"eff_dt_value"}, new Type[] {Hibernate.DATE})).add(
          Projections.groupProperty("primaryKey.seller", "seller").add(
          Projections.sum("totalSales")))); 


      // sub-select based on seller id 
      query.add(Property.forName("primaryKey.seller.id").eq(sellerId)).setFetchMode(
          "primaryKey.seller", FetchMode.SELECT); 

      query.add(Property.forName("primaryKey.effectiveDate").le(new Date())); 
      Date beginningOfLastMonth = DateUtils.truncate(DateUtils.addMonths(new Date(), -1) , Calendar.MONTH); 
      Date endOfLastMonth = DateUtils.addDays(DateUtils.truncate(new Date(), Calendar.MONTH), -1); 
      query.add(Property.forName("primaryKey.effectiveDate").between(beginningOfLastMonth, endOfLastMonth)); 


      return query.list(); 

Bitte beachten Sie, dass in meinem Fall muss ich Werte mit effectiveDate aus dem letzten Monat greifen.

Hoffentlich hilft das anderen im selben Boot! :)