0

Grails 1.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 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 の値を含む Book をロードしたいと考えています。クエリで Book を取得すると:

def book2 = Book.findAllByAuthor(author)

autor が関連付けられた応答を取得しますが、発行者は他のクエリで 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
}

または、books リレーションシップを定義した後に次のコードを追加して、ドメイン オブジェクトのフェッチ モードを変更することもできます。

static fetchMode = [books:"eager"]

パブリッシャー ドメイン オブジェクトに対して同じことを行うと、目的を達成できるはずです。意図したよりも多くのデータをロードする可能性があるという結果に注意する必要があります。

于 2009-12-03T13:12:12.010 に答える
0

Criteria を使用して、どのリレーションを熱心にロードするかを明示的に定義することをお勧めします。クエリで関係について言及するだけです。

例:

def c = Teacher.createCriteria()

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

get() メソッドは探しているものを返すべきではありませんか? 例: def book2 = Book.get(著者)

于 2009-12-03T22:23:52.470 に答える