2010-03-13 97 views
15

如果我有一个客户端域类,并且该客户端有许多课程。我如何找到我要找的课程?例如:Grails:我如何通过hasMany关系搜索儿童?

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

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

def client = Client.get(1) 

我想在该课程关系中“查找”或“搜索”。也许是这样的:

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

有没有办法与Grails做到这一点?

回答

27

如果您使用的是二级缓存,并已对这个关联配置它,你可能要遍历集合(这会为你节省数据库查询,如果该协会是在高速缓存)。

下面是一个使用巧妙Groovy Collection API一个例子:

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

重要提示:如果您决定采取这种方法确保的coursesconfigure eager/batch fetching,这样你就不会遇到the n+1 problem

+0

这种方法比下一个更好吗? – 2013-12-10 07:00:28

+0

这取决于你的用例。你应该避免使用关联,如果它可以不受限制地增长,但对于仅限于少数实体的关联(<10?),这可能对许多用例来说很好。 – Kimble 2013-12-10 09:55:53

+0

我会建议将搜索代码封装在服务方法或域类本身中(作为getter方法),以便您可以轻松地用真实世界的数据在基准测试中尝试不同的实现。 – Tobia 2015-06-17 07:51:26

12

一种方法是用动态finder方法:

Courses.findAllByClientAndName(client, 'whatever') 

这将让所有客户端的课程名为“什么”。

的Grails也有few other ways做到这一点。

+0

如果你没有belongsTo设置,你会怎么做? – monksy 2015-04-27 18:14:07

+1

您可以改为在连接列上查询。例如'findAllByClientIdAndName',如果'Course'对象具有'clientId'属性。这取决于你的域如何表达两个对象之间的关系。 – ataylor 2015-04-27 18:33:05