2015-08-26 246 views
0

我有一個叫做派對的域,有很多被邀請者。 party.invitees給我一個被邀請者的集合集合。 我只想得到一些受邀者,所以我嘗試在我的服務中做下面的事情。Grails-如何獲得集合集合中的部分值?

partInvitees= event?.invitees?.findAll{[offset: 3,max: 8]} 

它沒有給出正確的結果。它給我所有的被邀請者,而不僅僅是我所問的具體情況。

+0

您需要將篩選條件放在findAll閉包中。 – Abs

+0

@ Abs-我應該如何添加它? –

回答

0

您在此處調用的方法不是來自GORM,而是來自Groovy Collections。因此,即使您對它進行分頁(這在Groovy,AFAIK中不可能直接使用),您將把整個集合帶入內存。如果你不介意,只是做:

event?.invitees[offset..(offset-1)+max]

如果集合過大,你不希望將其帶到內存,還可以直接查詢Invitee

Invitee.findAllByEvent(event, [offset: 3,max: 8])

知道,爲了將不一定是相同,因爲Gorms' findAllBy不知道集合索引(我假設invitees是一個列表)。您可以使集合索引感知,但it's a bit tricky

+0

我不確定這句話是否正確:「你在那裏調用的'findAll'方法不是來自GORM ...」。 [Grails Docs中的findAll方法](http://grails.github.io/grails-doc/latest/ref/Domain%20Classes/findAll.html)中的** Description **部分說:「findAll方法允許使用Hibernate的查詢語言HQL查詢並通過示例查詢......「。所以,如果在Grails領域運行,那麼'find *'方法確實會被提升爲我相信的GORM公民。 – mohsenmadi

+0

這僅適用於針對域類調用的方法,就好像它們是靜態AFAIK一樣。 IntelliJ Idea似乎同意 - 如果我嘗試訪問針對集合調用的findAllBy的定義,它會告訴我「DefaultGroovyMethods」。另外,對於類型爲集合的屬性,文檔沒有意義 - 您期望做到這一點:event?.invitees.findAll(「from ...」)? – Deigote

+0

(我的評論給人的印象是我不確定,但我只是更詳細地介紹一些論點,而不是說「不,不是」......但我確實確信它就是這樣:) – Deigote

0

您可以使用GORM list()方法來獲取域類的整個集合。如果你只想要一個集合的子集,你可以使用list()和一些參數。

如果您的域名類別名稱爲Invite,則應使用Invite.list(max: 8, offset: 3, sort: "id", order: "asc")來獲取問題中描述的子集。請記住,不同的排序/順序參數可能會給你不同的結果。

有關更多信息,請參閱list()listOrderBy()文檔。

如果你想要Invites只適用於特定的Event你應該閱讀Deigote的答案。