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

时间:2016-09-23 06:56:30

标签: java grails gorm render grails-domain-class

我想知道如何列出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"}]

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

3 个答案:

答案 0 :(得分:3)

是的。这很简单。请尝试以下解决方案

  1. 解决方案1 ​​

    List userList = User.where{ status < 2 }.property("username").property("lastUpdated").list()
    
    render userList as JSON
    
  2. 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
      
    2. 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"}]