Grails Domain瞬态和计算

时间:2014-09-01 10:04:58

标签: grails grails-domain-class grails-controller

我有一个grails域,如下所示

User {
  sortedSet notifications
  static hasMany=[notifications:Notification]
}

Notification {
  Date dateCreated
  int status=0
  static belongsTo=[user:User]

  @Override
  public int compareTo(obj) {
     dateCreated.compareTo(obj.dateCreated)
  }
}

如果我将“用户”对象返回给GSP,是否有办法获取status = 1的所有通知的计数。

例如:user.notifications.size()(但其中status = 1)

无需返回另一个单独的通知对象。

3 个答案:

答案 0 :(得分:1)

你提到"瞬态"在标题中,但没有其他地方。你想声明一个瞬态属性来做这样的事情吗?...

class User {
    SortedSet notifications
    static hasMany=[notifications:Notification]
    static transients = ['numberOfStatusOnes']

    int getNumberOfStatusOnes() {
        notifications?.count { it.status == 1 } ?: 0
    }
}

答案 1 :(得分:0)

你可以使用namedQueries或类似的:

class User {

  static hasMany=[notifications:Notification]

  static namedQueries = {
    notificationsByStatus{ int status = 1 ->
      notifications{
        eq 'status', status
      }
    }
  }
}

你可以调用这个查询

User.notificationsByStatus.count()

答案 2 :(得分:0)

  

如果我将“用户”对象返回给GSP,有没有办法获得   status = 1

的所有通知的计数

由于您要将User返回给GSP,我假设您需要该对象并构建一个仅返回状态1通知的其他查询,这不是您想要的。相反,您可以查询User并获取所需信息。

在正在重新审阅用户对象的控制器中,您可以执行以下操作:

def someAction() {
    User u = // you got your user from somewhere:
    int numberOfStatusOnes = u.notifications.count { it.status == 1 }

    [user: u, numberOfStatusOnes: numberOfStatusOnes]
}

然后在您的GSP中引用user作为User类的实例,并在您引用numberOfStatusOnes时,这将是一个表示多少Notification的数字User 1}} status的{​​{1}}为1。