сумма грааля один ко многим - PullRequest
0 голосов
/ 04 августа 2011

Мне нужна помощь с тем, что я считаю очень тривиальным.

class User {
    String name 
    static hasMany = [files : File]
}

class File {
    long size
}

Теперь, когда мне нужен общий размер всех файлов, которые есть у данного пользователя, я использую следующее, которое работает:

def user = User.get(id)
user.files.each(total+=it.size)

но насколько это уродливо, когда я уверен, что это можно сделать с помощью простого запроса на выборку с помощью простого SQL или GORM / CRITERIA

Я пробовал что-то вроде File.sumBySize .. ()

Или

def c = File.createCriteria()
def f = c.list{
    eq("user",  user)   // What here ?
    projections
        {
        sum("size")
        }
    }   

Я не знаю, как указать родительские (пользовательские) отношения, которые не определены в классе File, но в таблицах объединения Grails

Любая помощь приветствуется

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Почему это уродливо? Для суммирования всех размеров файлов требуется всего 1 оператор (без SQL). Хотя, если хотите, вы можете использовать HQL следующим образом:

def user = User.get(id)
def sum = File.executeQuery("select sum(f.size) from File f where f.user = ?", user);

Но я думаю, что для этого вам нужно добавить принадлежащий файл в File. Вероятно, есть более простой метод HQL / GORM, который сейчас мне просто не приходит в голову, но, честно говоря, я не думаю, что есть что-то более легкое, чем то, что вы уже сделали.

0 голосов
/ 05 августа 2011

Более элегантный способ суммировать размеры файлов в коде Groovy:

def total = user.files.sum {it.size}

Но если вы сможете вычислить итоговые размеры файлов в запросе, который возвращает пользователей, я бы так и сделал.

0 голосов
/ 04 августа 2011

Вы можете сделать это с помощью запроса HQL, но у него есть небольшая проблема с именем поля 'size' (кажется, что это зарезервированное слово).Если вы переименуете его в «length», «fileSize» и т. Д., То это будет работать:

User.executeQuery(
   'select sum(file.length) from User u join u.files file where u.id=:userId',
   [userId: id])[0]
...