Sarit Rotshild
Sarit Rotshild

Reputation: 391

Grails- how to get part of the values in set collection?

I have a domain which call party and has many invitees. party.invitees give me a the set collection of the invitees. I want to get only some of the invitees so I try do do the followinf in my service.

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

It doesn't give the correct result. It gives me all the invitees instead only the specific I have asked.

Upvotes: 0

Views: 804

Answers (2)

lifeisfoo
lifeisfoo

Reputation: 16364

You could use the GORM list() method to get the entire collection for a domain class. If you want only a subset of the collection you could use list() with some parameters.

If your domain class is named Invite, you should use Invite.list(max: 8, offset: 3, sort: "id", order: "asc") to get the subset described in your question. Keep in mind that different sort/order params could give you different results.

See the list() or listOrderBy() documentation for more information.

If you want Invites only for a specific Event you should read the Deigote answer.

Upvotes: 0

Deigote
Deigote

Reputation: 1761

The findAll method you are invoking in there is not from GORM, but from Groovy Collections. So even if you paginate it (which is not possible directly in Groovy, AFAIK), you'll be bringing the whole collection into memory. If you don't mind, just do:

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

If the collection is too big and you don't want to bring it to memory, you can also query the Invitee directly:

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

But be aware that the order won't be necessarily the same, since Gorms' findAllBy doesn't know about the collection index (I'm assuming invitees is a list). You can make the collection index-aware, but it's a bit tricky.

Upvotes: 0

Related Questions