【问题标题】:Eager fetching the entire object tree in grails渴望在 grails 中获取整个对象树
【发布时间】:2012-08-21 12:00:04
【问题描述】:

所以我在域中有一些对象,它们彼此之间存在 hasMany 关系,如下所示

Class Car {
    String name
    SortedSet tires = [] as SortedSet
    static hasMany = [tires: Tire]
}

Class Tire {
    String type
    SortedSet screws = [] as SortedSet
    static hasMany = [screws: Screw]
}

Class Screws {
     String type
}

现在,我想通过 findByName 将整个对象树脱机,以获取某种类型的汽车。我知道我们可以在 finder 上做一个 fetch Eager,但这只会下降一个层次。在示例中,我有 2 个或更多级别。

所以我的问题是这样的。是否有一种优雅的解决方案可以急切地获取整个对象树,然后在没有 grails/Hibernate 触发另一个查询来获取详细信息的情况下使用它。

我尝试了以下似乎具有相似结果但几乎不优雅的方法。

withCriteria 解决方案

def cars = Car.withCriteria {
    tires {
        screws {
            join 'screws'
        }
    }

我还尝试将整个树转换为 JSON 并重新解析它,但这似乎有点矫枉过正。我想基本上我正在尝试使整个对象树脱机。有什么想法可以轻松完成或根本完成吗?

TIA

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    使用映射闭包:

    Class Car {
        String name
        SortedSet tires = [] as SortedSet
        static hasMany = [tires: Tire]
        static mapping = {
            tires lazy: false
        }
    }
    
    Class Tire {
        String type
        SortedSet screws = [] as SortedSet
        static hasMany = [screws: Screw]
        static mapping = {
            screws lazy: false
        }
    }
    
    Class Screws {
         String type
    }
    

    也许你应该像规则一样接受异常,我的意思是,你可以将你的域类配置为 lazy: false 并使用 fetch lazy 调用你的查找器:

    def cars = Car.findAllByType(type: "Alfa", [fetch: [tires: 'lazy']])
    

    我不知道这是否是一个有效的选择,但你可以试试。

    【讨论】:

    • 这绝对是一个选项,但我希望这仅发生在特殊情况下,而不是我所有其他呼叫的常规行为。这就是我避免更新域的原因。
    • 我猜你可以尝试使用 hql fetch 但并不比你的 withCriteria 解决方案更优雅。请记住,您可以将您的实际解决方案以静态方法封装到域类中,创建单元测试并稍后对其进行细化。
    • 我想。如果在 grails 中有一种方法可以使对象离线,那就太好了。我也尝试过克隆它,但是当你进入树时它变得太复杂了。
    • 接受这个作为答案可能是完成这项工作的最佳方式。仍在寻找一种方法来通过查找器来获得 grails 来做到这一点。如果我找到其他方法,将更新帖子。
    • 这行得通。现在我们将如何在同一个语句中懒惰地取钉子。你觉得会不会像 fetch: [tires.screws: 'lazy']?
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2014-05-15
    • 2011-01-11
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多