您能告诉我如何在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对象。有没有更好的方法来做到这一点? 非常感谢你!
答案 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或更少。
这个实现实际上是网络应用程序运行缓慢的最大原因之一......