2010-03-13 8 views
15

Si tengo una clase de dominio de cliente, y ese cliente tiene muchos cursos. ¿Cómo encuentro el curso que estoy buscando? Por ejemplo:Grails: ¿Cómo puedo buscar a través de los niños en una relación hasMany?

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

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

def client = Client.get(1) 

Quiero "buscar" o "buscar" dentro de esa relación de cursos. Tal vez algo como:

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

¿Hay alguna manera de hacer esto con Grails?

Respuesta

27

Si está utilizando un caché de segundo nivel y lo ha configurado para esta asociación, es posible que desee iterar sobre la colección (esto le ahorrará una consulta de base de datos si la asociación está en caché).

Aquí hay un ejemplo usando el inteligente Groovy Collection API:

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

Importante: Si usted decide tomar este enfoque, asegúrese de configure eager/batch fetching de courses por lo que no se opongan a the n+1 problem.

+0

es este enfoque mejor que el siguiente? –

+0

Depende de su caso de uso. Realmente debería evitar el uso de asociaciones si puede crecer sin límites, pero para las asociaciones limitadas a unas pocas entidades (<10?) Esto probablemente servirá para muchos casos de uso. – Kimble

+0

Recomendaría encapsular el código de búsqueda en un método de servicio o en la propia clase de dominio (como método getter) para que pueda probar fácilmente diferentes implementaciones en un punto de referencia con datos del mundo real. – Tobia

12

Una forma es con métodos de búsqueda dinámica:

Courses.findAllByClientAndName(client, 'whatever') 

Esto conseguiría todos los cursos de un cliente llamado 'lo que sea'.

Grails también tiene few other ways para lograr esto.

+0

¿Qué hace si no tiene la configuración belongsTo? – monksy

+1

En su lugar, puede consultar en la columna de unión. Por ejemplo 'findAllByClientIdAndName' si el objeto' Course' tiene una propiedad 'clientId'. Depende de cómo su dominio expresa la relación entre los dos objetos. – ataylor

Cuestiones relacionadas