在GORM中按周/月/年分组

Kum*_*hav 1 grails grails-orm

我有一个域类(缩小)为: -

class Expense {
    Date dateOfExpense
    int amount
}
Run Code Online (Sandbox Code Playgroud)

我试图获得按周/月/费用日期分组的金额总和.参考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]                  
    }
}
Run Code Online (Sandbox Code Playgroud)

抛出异常:

 No such property: DATE for class: grails.orm.HibernateCriteriaBuilder. Stacktrace follows:
 Message: No such property: DATE for class: grails.orm.HibernateCriteriaBuilder
Run Code Online (Sandbox Code Playgroud)

请建议使用sqlGroupProjection方法的方法

Kum*_*hav 5

  1. 在域类中为每周,每月和每年创建三个新的数字字段.这些字段不会映射到表中的列.
  2. 为这三个字段提供静态映射.

    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)')
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在我们可以使用所需的字段进行分组

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')
  }
}
Run Code Online (Sandbox Code Playgroud)