0

Grails 1.1.1 Goovy 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 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)
  }
}

我想用 Publisher 和 Author 的值加载一本书。当我得到一本带有查询的书时:

def book2 = Book.findAllByAuthor(author)

我得到了与作者关联的响应,但发布者在另一个查询中只有 id 和 name 类:

def book3 = Book.findAllByPublisher(publisher)

我检索了相反的结果,我有出版商数据的书,但作者只有 id 和类名。

定义的模型中的错误在哪里?o 查询方式有误?

编辑:

我需要只使用这样的查询来检索值的方法:

def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']])

在这一点上,我可以管理出版商的价值。

问题:如果出版商有一个hasmanyDomain相关的,得到这本书我能够阅读的属性?

谢谢。谢谢。

4

3 回答 3

1

默认情况下,延迟获取与 gorm 关联一起使用。如果要启用即时获取,可以通过将以下映射块添加到 Author 域类来修改 ORM DSL:

static mapping = {
    books lazy:false
}

或者您可以在定义书籍关系后添加以下代码来更改域对象中的获取模式。

static fetchMode = [books:"eager"]

对您的 Publisher 域对象执行相同操作应该可以让您完成您想要的。您确实需要注意可能会加载比您预期更多的数据的后果。

于 2009-12-03T13:12:12.010 回答
0

get() 方法不应该返回您要查找的内容吗?示例:def book2 = Book.get(author)

于 2009-12-03T22:23:52.470 回答
0

您最好使用 Criteria 并明确定义应该急切加载哪些关系。只需在查询中提及关系。

例子:

def c = Teacher.createCriteria()

List<Teacher> results = c.list {
            subjects {
                attendees {}
            }
        }
于 2015-12-13T01:55:47.263 回答