2009-05-29 27 views
3

私はHQLを使用して月にいくつかの行をグループ化しようとしていますが、私はそのAPIを初めて使用しているため、動作させることができません。このクエリでHQL:月ごとのグループ

 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」)の月ごとに1つの行を必要とするとき、日ごとに1つの行を返すために起こっていることである:

は、ここに私のコードです。

私はProjections.groupPropertyの代わりにProjections.sqlGroupProjectionを使用することを考えましたが、いくつかのHQLをスローしましたが、私が見つけたドキュメンテーションとカップルの例は、私が正しいpostresql文を入れて方法。

PostgresとHQLについて知っている人なら、ここでいくつかのヒントを教えてください。

+1

これは、HibernateのHQLを使用していない、これはHibernateの基準を使用しています。 HQLとしてタグ付けするべきではありません。 – James

答えて

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と値を取得する必要がありますのでご注意ください。

これは、同じボートの他の人に役立つことを願っています。 :)

関連する問題