Grails中的投影

Đin*_*hâu 1 dns grails dynamic

你能告诉我如何在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()
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*cel 7

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

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

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

List users = getUserNamesByIds(...)
String concatenatedNames = (users ? users.join(",") : "")
Run Code Online (Sandbox Code Playgroud)

您可以在Grails用户指南中阅读有关标准和投影的更多信息.