grails总和一对多

时间:2011-08-04 17:32:31

标签: grails sum gorm

我需要帮助我认为非常微不足道的东西。

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 个答案:

答案 0 :(得分:1)

为什么那么难看?它只需要1个语句(根本没有SQL)来总结所有文件大小。虽然如果你愿意,你可以能够像这样使用HQL:

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

但我认为你需要添加一个belongsTo to File来做到这一点。可能还有一个更简单的HQL / GORM方法,目前还没有出现在我的脑海中,但老实说,我认为没有比你已经做过的更容易了。

答案 1 :(得分:0)

您可以使用HQL查询来执行此操作,但“size”字段的名称存在一个小问题 (似乎是一个保留字)。如果你将它重命名为'length','fileSize'等,那么这将起作用:

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

答案 2 :(得分:0)

在Groovy代码中对文件大小求和的更优雅方法是:

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

但是,如果您可以在返回用户的查询中计算文件大小总计,那就是我的方式。