Grails GORM域类关系
Grails1.1.1 古维1.5.7 在这种关系中: 作者1--n本书n--1出版商 在Grails中定义:Grails GORM域类关系,grails,dns,gorm,eager-loading,eager,Grails,Dns,Gorm,Eager Loading,Eager,Grails1.1.1 古维1.5.7 在这种关系中: 作者1--n本书n--1出版商 在Grails中定义: class Author { String firstName String lastName static hasMany = [books: Book] static constraints = { books(nullable: true) } } class Book { String ti
class Author {
String firstName
String lastName
static hasMany = [books: Book]
static constraints = {
books(nullable: true)
}
}
class Book {
String title
Author author
Publisher publisher
static constraints = {
author(nullable: true)
publisher(nullable: true)
}
}
class Publisher {
String name
static hasMany = [books: Book]
static constraints = {
books(nullable: true)
}
}
我想载入一本具有出版商和作者价值观的书。
当我得到一本带有查询的书时:
def book2 = Book.findAllByAuthor(author)
我得到了autor Associated的响应,但发布者在另一个查询中只有id和name类:
def book3 = Book.findAllByPublisher(publisher)
我检索到相反的结果,我有一本带有出版商数据的书,但作者只有id和类名
定义模型中的错误在哪里?o执行查询的方式中是否存在错误
编辑:
我需要的方法是仅通过以下查询检索值:
def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']])
在这本书中,我可以管理publisher的价值
问题:如果出版商有一个拥有许多相关的或域
,那么我能读懂这本书的属性吗
谢谢。
谢谢。默认情况下,gorm关联使用延迟抓取。如果要启用即时抓取,可以通过向Author域类添加以下映射块来修改ORM DSL:
static mapping = {
books lazy:false
}
或者,您可以在定义books关系后,通过添加以下代码来更改域对象中的获取模式
static fetchMode = [books:"eager"]
对您的Publisher域对象执行相同的操作将允许您完成所需的任务。您确实希望小心这样的后果,即您可能会加载比预期更多的数据。get()方法不应该返回您要查找的数据吗?
示例:def book2=Book.get(author)您最好使用条件并明确定义应该加载哪些关系。只需在查询中提到关系
例如:
def c = Teacher.createCriteria()
List<Teacher> results = c.list {
subjects {
attendees {}
}
}
def c=Teacher.createCriteria()
列表结果=c.List{
科目{
与会者{}
}
}
谢谢。但我对问题的另一面很感兴趣,因为你在说:你确实想小心这样做的后果:你可能会加载比你预期更多的数据。-o执行查询的方式中是否存在错误?我找到了一个解决方案,将参数fetch
添加到quey:-def book2=Book.findAllByAuthor(author[fetch:[publisher:'eager']])中,我也得到了发布者。如果出版商有任何其他需要检索的实体,我该怎么办?添加和添加参数。谢谢。如果您没有定义Publisher使用“急切获取”模式引用的其他对象,那么就我所知,您将不得不对该对象进行迭代。我不想反复迭代,这是我的问题。访问DDBB的次数太多。如果我发现了什么,我会把它贴在这里。感谢您的时间和快速的好答案。Grails1.1.1捆绑了Groovy1.6.3($Grails_HOME/lib/Groovy-all-1.6.3.jar),除非您更换了这个jar,否则Grails1.1.1将使用Groovy1.6.3。没什么大不了的,但值得一提:-)格式不好:def book2=Book.get(author)
这样:def book2=Book.findByAuthor(author)
我只从书和作者域获得数据,而不是从出版商那里获得的数据。