1

次のようなドメインクラス(縮小)があります:-

class Expense {
    Date dateOfExpense
    int amount
}

支出日の週/月/年ごとにグループ化された金額の合計を取得しようとしています。grails doc http://grails.org/doc/latest/guide/GORM.htmlの 'sqlGroupProjection' メソッドを参照すると、

次のコードを使用してみました:-

def results = c {
    between("dateOfExpense", fromDate, toDate)              
    projections {
         sqlGroupProjection 'dateOfExpense,sum(amount) as summed',       
        'MONTH(dateOfExpense)',['date','summed'],[DATE,NUMBER]                  
    }
}

例外をスローします:

 No such property: DATE for class: grails.orm.HibernateCriteriaBuilder. Stacktrace follows:
 Message: No such property: DATE for class: grails.orm.HibernateCriteriaBuilder

sqlGroupProjectionメソッドを使用したアプローチを提案してください

4

4 に答える 4

5
  1. ドメイン クラスに、週、月、年ごとに 3 つの新しい数値フィールドを作成します。これらのフィールドは、テーブルの列にマップされません。
  2. 3 つのフィールドに静的マッピングを提供します。

    static mapping = {
         //provide the exact column name of the date field
         week formula('WEEK(DATE_OF_EXPENSE)')    
         month formula('MONTH(DATE_OF_EXPENSE)')
         year formula ('YEAR(DATE_OF_EXPENSE)')
    }
    

これで、次を使用して目的のフィールドでグループ化できます

def results = c.list {
  between("dateOfExpense", fromDate, toDate) 
  projections {
    switch(groupBy){
        case "week":
           groupProperty('year')
           groupProperty('month')
           groupProperty('week') 
        break;
        case "month"
           groupProperty('year')
           groupProperty('month')
        break;
        case "year":
           groupProperty('year')
        break;
    }        
    sum('amount')
  }
}
于 2013-01-02T09:28:35.907 に答える
1

これの代わりに

static mapping = {

week formula('WEEK(DATE_OF_EXPENSE)')    //provide the exact column name of the date field
month formula('MONTH(DATE_OF_EXPENSE)')
year formula ('YEAR(DATE_OF_EXPENSE)')

}

これを試して

static mapping = {

week formula: 'WEEK(DATE)'    
month formula: 'MONTH(DATE)'
year formula: 'YEAR(DATE)'

}
于 2014-08-27T14:00:10.640 に答える
0

このsqlGroupProjection方法は十分にサポートされていないようです。使用する

def results = c.list {
    between("dateOfExpense", fromDate, toDate) 
    projections {
        groupProperty('dateOfExpense')
        sum('amount')
    }
}

当然の結果を生み出します。

日付の月ごとにグループ化する場合は、 Grailsの日付ごとのグループ化を参照してください(実際、私の答えよりも完全に重要です。しかし、コードを長時間試した後、同じ解決策に到達します)。

于 2012-12-29T16:45:03.950 に答える
0

次のようなものを試してください

sqlGroupProjection 'MONTH(dateOfExpense) as month, sum(amount) as summed',
    'month',['month','summed'],[NUMBER,NUMBER]
于 2012-12-29T16:00:12.340 に答える