【问题标题】:How to get an average of a hasMany instance property in grails domain classes?如何在 grails 域类中获取 hasMany 实例属性的平均值?
【发布时间】:2012-02-05 19:16:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    此 HQL 查询将起作用:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以通过 Employee 域类上的一个简单方法来完成此操作。

      class Employee {
          String employeeName
          static hasMany = [votes: Vote]
      
          def sumVotes() {
              votes.voteRank.sum() / votes.size()
          }
      }
      

      【讨论】:

      • 如果voteRank 可以为空,则取决于您希望如何处理它。您可以将其计为 0 并使用 votes.voteRank.sum { it ? it : 0 }
      • 恕我直言:此解决方案将产生不良结果,因为 size() 将返回包括空值在内的值计数。也许过滤掉它们是一个不错的选择: votes.findAll{it.voteRank!=null}.with{it.voteRank.sum() / it.size()}
      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2010-11-01
      • 2016-07-09
      • 2015-12-10
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多