2009-05-29 78 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抢值。

希望这将帮助在同一条船上的其他人! :)