如何在grails域类中获得hasMany实例属性的平均值?

时间:2012-02-05 19:16:13

标签: grails gorm

我在Grails应用程序中有两个类, Employee 对另一个名为投票

的类具有hasMany(一对多关系)
class Employee {
   String employeeName   
   static hasMany = [votes:Vote]
}

并且投票类有voteRank整数属性,所有员工按1-10的等级投票,每个员工都包含其他员工给出的这些投票的列表

class Vote {
   Integer voteRank
   static belongsTo =[employee:Employee]
}

如何获得每位员工所有选票的平均值。这可以通过使用group by子句在SQL中解决。但我正在为这个问题寻找grails域映射和面向gorm的答案。

2 个答案:

答案 0 :(得分:4)

此HQL查询将起作用:

def averages = Employee.executeQuery(
    'select e, avg(vote.voteRank) ' +
    'from Employee e join e.votes vote ' +
    'group by e')

这将返回List Object[]个数组,其中第一个元素是Employee,第二个是平均值。如果您不想返回整个Employee实例,可以选择一个或多个属性:

def averages = Employee.executeQuery(
    'select e.employeeName, avg(vote.voteRank) ' +
    'from Employee e join e.votes vote ' +
    'group by e')

答案 1 :(得分:2)

您可以使用Employee域类上的简单方法完成此操作。

class Employee {
    String employeeName
    static hasMany = [votes: Vote]

    def sumVotes() {
        votes.voteRank.sum() / votes.size()
    }
}