4

所以我在域中有一些对象,它们彼此之间存在 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

4

1 回答 1

4

使用映射闭包:

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']])

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

于 2012-08-26T23:36:57.807 回答