Как получить среднее значение свойства экземпляра hasMany в классах домена grails? - PullRequest
1 голос
/ 05 февраля 2012

У меня есть два класса в приложении Grails, Сотрудник имеет hasMany (отношения один ко многим) для другого класса под названием Голосовать

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

и класс голосования имеет целочисленное свойство voiceRank, и все сотрудники голосуют по шкале от 1 до 10, и каждый сотрудник содержит список этих голосов, отданных другими сотрудниками

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

Как получить среднее значение всех голосов, отданных за сотрудника. Это может быть решено в SQL с помощью предложения group by. Но я ищу отображение доменов Grails и Gorm-ориентированный ответ на эту проблему.

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Этот запрос 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')
2 голосов
/ 06 февраля 2012

Это можно сделать простым методом в классе домена Employee.

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

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