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

时间:2011-12-27 11:57:00

标签: grails gorm

我试图找出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
    }

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

谢谢!

3 个答案:

答案 0 :(得分:10)

文档说:

  

Grails使用的默认提取策略是“懒惰”,这意味着   该系列将被懒惰地初始化。这可以导致n + 1   问题,如果你不小心。如果你需要“渴望”抓取,你可以   使用ORM DSL或指定eager fetching作为查询的一部分

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

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

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

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

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

酷啊!!!!

答案 1 :(得分:5)

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

XML.use('deep') {
    render books as XML
}

答案 2 :(得分:2)

查看docs section 5.3.4。它是使用您的域类中的fetchMode完成的:

static fetchMode = [things:"eager"]

然而,如果您只查找对象的ID以填充XML文件(或其他字段),我会查看projection criteria以获得更好的大的效果集合