Grails有没有办法急于获取整个记录?

iKT*_*iKT 6 grails grails-orm

我试图找到Grails中是否有任何方法来急切获取完整记录而不是左连接.

我有两个类,一对多映射.当我尝试获取所有记录并呈现为XML时,只有"很多"侧的ID才会进入XML文件.无论如何要获得整个记录?

我使用的示例如下:

我有3个班:

用户,书籍和章节

Users和Book有多对多的映射,Book to Chapters是一对多的映射.我有一个UserBook类,它定义了多对多的关系.现在我有以下代码

user = User.findByUserId(params.userid.toString())
        def books = user.getAllBooks()
        render books as XML

Set<Book>getAllBooks() {
        UserBook.findAllByUser(this).collect {it.book} as Set
    }
Run Code Online (Sandbox Code Playgroud)

上面提供了带有书籍的XML以及每本书的章节ID.我想要的是上面的"书籍",以包含所有的章节信息.

谢谢!!

小智 10

文档说:

Grails使用的默认提取策略是"懒惰",这意味着该集合将被懒惰地初始化.如果你不小心,这可能会导致n + 1问题.如果您需要"急切"提取,您可以使用ORM DSL或指定急切提取作为查询的一部分

您可以在域类中指定获取策略,但是恕我直言,获得1米关系的最佳策略是通过添加到域类或标准的方法获取或加入查询,例如:

// You have a Book with many Authors, then you specify the fetching strategy with eager
def results = Book.list(fetch:[authors:"eager"])
Run Code Online (Sandbox Code Playgroud)

在其他情况下,您可以使用Hibernate Fetch Mode的标准:

import org.hibernate.FetchMode as FM
…
def results = c.list {
    maxResults(10)
    firstResult(50)
    fetchMode("aRelationship", FM.JOIN)
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是,如果您了解HQL,那么您可以使用它,因为可以指示在HQL中获取,例如:def result = DomainClass.findAll("HQL_Sentence")

很酷呃!!!!


Cle*_*Sum 5

如果您正在寻找XML输出以包含完整章节信息而不是仅包含ID,请尝试使用"深度"XML编组(对于JSON也是如此):

XML.use('deep') {
    render books as XML
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*Lee 2

查看文档第 5.3.4 节。这是使用域类中的 fetchMode 完成的:

static fetchMode = [things:"eager"]
Run Code Online (Sandbox Code Playgroud)

但是,如果您只是寻找对象的 ID 来填充 XML 文件(或其他字段),我会检查投影标准,以便在大型集合上获得更好的性能。