我想知道如何列出Grails域并同时排除某些字段。我猜解决方案必须简单,但我无法看到它。
我准备了域用户的一些例子:
class User implements Serializable {
String username
String email
Date lastUpdated
String password
Integer status
static constraints = { }
static mapping = { }
}
此时我想列出状态低于2的所有用户。
render User.findAllByStatusLessThen(2) as JSON
我想在没有某些字段的情况下向客户端呈现JSON响应。例如,我只想使用字段 用户名 和 lastUpdated 呈现用户,因此呈现的JSON将如下所示:< / p>
[{"username": "user1", "lastUpdated":"2016-09-21 06:49:46"}, {"username": "user2", "lastUpdated":"2016-09-22 11:24:42"}]
实现这一目标的最简单方法是什么?
答案 0 :(得分:3)
是的。这很简单。请尝试以下解决方案
解决方案1
List userList = User.where{ status < 2 }.property("username").property("lastUpdated").list()
render userList as JSON
output
[{"user1", "2016-09-21 06:49:46"}, {"user2", "2016-09-22 11:24:42"}]
解决方案2 - 使用此功能,您将获得Key-Value
对
List userList = User.findAllByStatusLessThen(2)?.collect{
[username : it.username, lastUpdated: it.lastUpdated]}
render userList as JSON
output
[{"username": "user1", "lastUpdated":"2016-09-21 06:49:46"}, {"username": "user2", "lastUpdated":"2016-09-22 11:24:42"}]
答案 1 :(得分:2)
您正在寻找Grails projections 。
def result = Person.createCriteria().list {
lt("status", 2)
projections {
property('username')
property('lastUpdated')
}
} as JSON
答案 2 :(得分:1)
如果您希望结果位于key-value
对,那么您可以利用HQL
查询
def query = """select new map(u.username as username, u.lastUpdated as lastUpdated) from User u where status < 2"""
def result = User.executeQuery(query)
println (result as JSON)
这将为您提供如下输出
[{"username": "user1", "lastUpdated":"2016-09-21 06:49:46"}, {"username": "user2", "lastUpdated":"2016-09-22 11:24:42"}]