【问题标题】:Grails: How can I search through children in a hasMany relationship?Grails:如何在 hasMany 关系中搜索孩子?
【发布时间】: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 做到这一点?

【问题讨论】:

    标签: grails


    【解决方案1】:

    如果您正在使用二级缓存并为此关联配置了它,您可能需要遍历集合(如果关联在缓存中,这将为您节省数据库查询)。

    这是一个使用聪明的Groovy Collection API的例子:

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

    重要提示:如果您决定采用这种方法,请确保configure eager / batch fetchingcourses,这样您就不会遇到the n+1 problem

    【讨论】:

    • 这种方法比下一种更好吗?
    • 这取决于您的用例。如果关联可以无限增长,您应该避免使用关联,但对于仅限于少数实体(
    • 我建议将搜索代码封装在服务方法或域类本身(作为 getter 方法)中,以便您可以在具有真实数据的基准测试中轻松尝试不同的实现。
    【解决方案2】:

    一种方法是使用动态查找器方法:

    Courses.findAllByClientAndName(client, 'whatever')
    

    这将使客户的所有课程都命名为“whatever”。

    Grails 也有 few other ways 来完成这项工作。

    【讨论】:

    • 没有belongsTo设置怎么办?
    • 您可以改为查询加入列。例如,findAllByClientIdAndName 如果 Course 对象具有 clientId 属性。这取决于您的域如何表达两个对象之间的关系。
    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多