2009-05-29 8 views
3

J'essaye de grouper par mois certaines lignes en utilisant HQL, mais je suis un peu nouveau dans cette API et je n'arrive pas à l'obtenir.HQL: groupe par mois

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

Mon problème avec cette requête est qu'il va retourner une ligne par jour quand j'ai besoin d'une ligne par mois à cause de Projections.groupProperty (« effectiveDate »). J'ai envisagé d'utiliser Projections.sqlGroupProjection au lieu de Projections.groupProperty et de lancer quelques HQL, mais la documentation et les exemples de couple que j'ai trouvés ne m'ont pas vraiment aidé à comprendre comment j'allais mettre la bonne instruction postresql dans ce méthode.

Quelqu'un qui connaît Postgres et HQL pourrait donner quelques conseils s'il vous plaît?

+1

Ceci n'utilise pas HQL d'Hibernate, c'est l'utilisation des critères d'Hibernate. Il ne devrait pas être étiqueté comme HQL. – James

Répondre

6

trouvé la solution:

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

S'il vous plaît noter que, dans mon cas, je dois saisir les valeurs avec effectiveDate depuis le mois dernier.

Espérons que cela aidera les autres dans le même bateau! :)