2014-09-01 101 views
0

我有一個Grails領域,看起來像下面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,有沒有辦法讓所有的通知,其中狀態的計數= 1。

例如:user.notifications.size()(但是其中狀態= 1)

而不必返回另一個單獨的通知對象。

回答

1

你提到這個詞在標題爲「瞬態」,但在其他地方。你想聲明一個短暫的財產做這樣的事情?......

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

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

嗨,謝謝,這是最好的解決方案! – 2014-09-02 10:11:18

0

可以使用namedQueries或相似:

class User { 

    static hasMany=[notifications:Notification] 

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

你可以打電話查詢,以便

User.notificationsByStatus.count() 
+0

在那種很接近......的「通知」想出了一個下劃線...例如,它不能解決呢?當我嘗試啓動程序並尋找$ {user.notificationsByStatus}它無法解決此問題。「沒有此類屬性:notificationsByStatus爲類:tutor.com.User」 – 2014-09-01 12:37:59

+0

$ {user.notificationsByStatus}不應該工作在所有。你必須調用'$ {user.notificationsByStatus.count()}'或'$ {user.notificationsByStatus.list()}' – injecteer 2014-09-01 12:39:54

+0

你正在使用哪個grails版本? – injecteer 2014-09-01 12:40:18

0

如果我返回「用戶」對象的GSP,是有什麼辦法獲得狀態= 1的所有通知的 計數

由於您正在將User返回給GSP,因此我認爲有一些原因需要該對象並構建不同的查詢,該查詢只返回狀態1通知不是您想要的。相反,您可以詢問User並獲取所需的信息。

在你的控制器,該控制器retriving用戶對象,你可以做這樣的事情:

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 s表示User具有有status 1.