2009-05-29 76 views
3

我想按月使用HQL組織一些行,但是我對這個API很陌生,似乎無法讓它工作。HQL:group by month

這裏是我的代碼:

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

我與此查詢的問題是,它會每天返回一行,當我需要每因爲Projections.groupProperty(「EFFECTIVEDATE」)的月一行。

我想過使用Projections.sqlGroupProjection而不是Projections.groupProperty並拋出一些HQL,但我發現的文檔和幾個示例並沒有真正幫助我理解如何將正確的postresql語句放入方法。

任何知道Postgres和HQL的人都可以提供一些提示嗎?

+1

這不使用Hibernate的HQL,這是使用Hibernate的標準。它不應該被標記爲HQL。 – James 2009-10-29 18:32:48

回答

6

找到了解決辦法:

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

請注意,在我的情況,我需要從上個月EFFECTIVEDATE搶值。

希望這將幫助在同一條船上的其他人! :)