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

在 Grails 中扩展具有一对多关系的域类

Grails 默认排序的“hasMany”域属性

使用 hasmany 字符串查询 Grails / GORM 条件