intargc
intargc

Reputation: 3111

Grails: How can I search through children in a hasMany relationship?

If I have a Client domain class, and that Client hasMany Courses. How do I find the course I'm looking for? For instance:

class Client {
    String name
    static hasMany = [courses:Course]
}

class Course {
    String name
    static belongsTo = [client:Client]
}

def client = Client.get(1)

I want to "find" or "search" within that courses relationship. Maybe something like:

client.courses.find(name:'Whatever')

Is there any way to do this with Grails?

Upvotes: 16

Views: 23642

Answers (2)

ataylor
ataylor

Reputation: 66069

One way is with dynamic finder methods:

Courses.findAllByClientAndName(client, 'whatever')

This would get all a client's courses named 'whatever'.

Grails also has few other ways to accomplish this.

Upvotes: 12

Kimble
Kimble

Reputation: 7554

If you're using a second level cache and have configured it for this association, you might want to iterate over the collection (this will save you a database query if the association is in cache).

Here is an example using the clever Groovy Collection API:

def course = client.courses.find { it.name == "whatever" }

Important: If you decide to take this approach make sure to configure eager / batch fetching of courses so you don't run into the n+1 problem.

Upvotes: 29

Related Questions