列出Grails域时如何排除某些字段?

How to exclude some fields when listing Grails domain?

我想知道如何列出 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 响应。例如,我只想呈现具有字段 usernamelastUpdated[= 的用户28=] 这样呈现的 JSON 看起来像这样:

[{"username": "user1", "lastUpdated":"2016-09-21 06:49:46"}, {"username": "user2", "lastUpdated":"2016-09-22 11:24:42"}]

实现该目标的最简单方法是什么?

Yeah.It的simple.Try以下解决方案

  1. 解决方案 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"}]
  1. 解决方案 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"}]

您正在寻找 Grails projections

def result = Person.createCriteria().list {
    lt("status", 2)
    projections {
        property('username')
        property('lastUpdated')
    }
} as JSON

好吧,如果您希望结果在 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"}]