Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I search for elements whose collection contains another element in Grails?

Let's say I have a domain class called "User" which can follow other "User" objects. It does so having a field specified as:

def hasMany=[followedUsers:User]

I need to do the reverse (find all User objects that follow a specific User object) without setting up the reverse relationship, since it is not a use case performed often. I tried to do something like this, using closures:

User.findAll { it.followedUsers.contains(userInstance) }

but this always returns all users in the database, regardless of their follow status. I tried doing with HQL but failed miserably as well.

Could anyone give me a quick pointer on the simplest way to accomplish this? Thank you.

like image 470
ArmlessJohn Avatar asked Jan 20 '12 18:01

ArmlessJohn


2 Answers

You can use this HQL query:

User.executeQuery(
   'select u from User u where :follower in elements(u.followedUsers)',
   [follower: userInstance])
like image 71
Burt Beckwith Avatar answered Oct 16 '22 11:10

Burt Beckwith


In my opinion, this syntax is much cleaner:

User.withCriteria { followedUsers{ eq('id', userInstance.id) } }
like image 41
Lucas Avatar answered Oct 16 '22 11:10

Lucas