Grails中的投影

时间:2011-03-17 17:36:45

标签: grails dynamic dns

您能告诉我如何在Grails域类上进行投影吗?!在我的情况下,我想通过他们的ID得到(例如)用户名的列表。这意味着在我的方法中,我传递一个userId列表并获取用户名的列表。 Groovy域的动态方法是否支持此功能?目前,我正在使用我的以下功能:

public String getUserNamesByIds(String[] ids) {
    StringBuffer names = User.get(Integer.parseInt(ids[0]).getName())
    if(ids.length > 1) {
        (1..ids.length - 1).each{
             names.append(", " + User.get(Integer.parseInt(ids[it])).getName())
        }
    }
    return names.toString()
}

如您所见,我只想获取名称(并构建总字符串)。我认为这不好,因为我必须做很多小步骤,并对数据库执行许多查询以获取User对象。有没有更好的方法来做到这一点? 非常感谢你!

2 个答案:

答案 0 :(得分:7)

您可以使用条件和投影来获取给定其ID的用户的名称,执行以下操作:

public List getUserNamesByIds(String[] ids) {
    def criteria = User.createCriteria()
    return criteria.list {
       projections {
         property("name")
       }
       'in'("id", ids)
    }
}

然后,您可以通过执行以下操作将用户名列表转换为字符串:

List users = getUserNamesByIds(...)
String concatenatedNames = (users ? users.join(",") : "")

您可以在Grails user guide中阅读有关标准和预测的更多信息。

答案 1 :(得分:1)

这是一个糟糕的主意。原因是每次调用User.get(id)都会通过网络进行调用。这是非常昂贵的,即使您的数据库在20毫秒内响应,其中1000个也需要20秒 - 相当长的时间让您的用户等待。更好的想法是通过某种查询获取您感兴趣的用户集,然后在内存中迭代它们。每个循环调用需要1 ns或更少。

这个实现实际上是网络应用程序运行缓慢的最大原因之一......