我试图找出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。我想要的是上面的“书籍”,也包含所有的章节信息。
谢谢!
答案 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以获得更好的大的效果集合强>