我需要帮助我认为非常微不足道的东西。
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连接表中的父(用户)关系
任何帮助表示赞赏
答案 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}
但是,如果您可以在返回用户的查询中计算文件大小总计,那就是我的方式。