Grails:如何在 hasMany 关系中搜索孩子?
Posted
技术标签:
【中文标题】Grails:如何在 hasMany 关系中搜索孩子?【英文标题】:Grails: How can I search through children in a hasMany relationship? 【发布时间】:2011-01-27 02:29:42 【问题描述】:如果我有一个客户端域类,并且该客户端有许多课程。如何找到我正在寻找的课程?例如:
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 做到这一点?
【问题讨论】:
【参考方案1】:如果您正在使用二级缓存并为此关联配置了它,您可能需要遍历集合(如果关联在缓存中,这将为您节省数据库查询)。
这是一个使用聪明的Groovy Collection API的例子:
def course = client.courses.find it.name == "whatever"
重要提示:如果您决定采用这种方法,请确保configure eager / batch fetching 或courses
,这样您就不会遇到the n+1 problem。
【讨论】:
这种方法比下一种更好吗? 这取决于您的用例。如果关联可以无限增长,您应该避免使用关联,但对于仅限于少数实体( 我建议将搜索代码封装在服务方法或域类本身(作为 getter 方法)中,以便您可以在具有真实数据的基准测试中轻松尝试不同的实现。 【参考方案2】:一种方法是使用动态查找器方法:
Courses.findAllByClientAndName(client, 'whatever')
这将使客户的所有课程都命名为“whatever”。
Grails 也有 few other ways 来完成这项工作。
【讨论】:
没有belongsTo设置怎么办? 您可以改为查询加入列。例如,findAllByClientIdAndName
如果 Course
对象具有 clientId
属性。这取决于您的域如何表达两个对象之间的关系。以上是关于Grails:如何在 hasMany 关系中搜索孩子?的主要内容,如果未能解决你的问题,请参考以下文章
为啥grails在第一次访问hasMany关系时抛出空指针异常?
grails:脚手架为具有 hasMany 关系的域创建视图
Grails - 简单的 hasMany 问题 - 在 create.gsp 中使用 CheckBoxes 而不是 HTML Select