我试图找到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")
很酷呃!!!!
如果您正在寻找XML输出以包含完整章节信息而不是仅包含ID,请尝试使用"深度"XML编组(对于JSON也是如此):
XML.use('deep') {
render books as XML
}
Run Code Online (Sandbox Code Playgroud)
查看文档第 5.3.4 节。这是使用域类中的 fetchMode 完成的:
static fetchMode = [things:"eager"]
Run Code Online (Sandbox Code Playgroud)
但是,如果您只是寻找对象的 ID 来填充 XML 文件(或其他字段),我会检查投影标准,以便在大型集合上获得更好的性能。