2016-10-07 15 views
0

かなり複雑なGroovyアプリケーションを継承し、現在存在する厄介なクエリパターンをより良く解決できる方法を理解しようとしています。GroovyとHibernate - 1対多のリレーションシップでの実行クエリ

単に、私のようなものがあります:私は、私に<List>Aを返してA.findAllByUser(user)を行うにしようよ、私はそのリストの上にitering起動したときしかし、私はさらにあるクエリの数百人を打ってる

Class A { 
    User user 
    Bravo bravo 
    static hasMany = [foo: Foo, bar: Long] 
} 

Class Foo { 
    User user 
    Delta delta 
    static belongsTo = [a: A] 
    static hasMany = [woo: Woo] 
} 

Class Woo { 
    User user 
    Alpha alpha 
    static belongsTo = [foo: Foo] 
} 

bravoおよびfooを構築する。

しかし私は、これは、これら2つに触れるすべてのクエリは、常にこれらのクエリを行います(まだbravoを打つクエリの数百を解決しないことを意味し、FooのクラスにFoo fetch:"join"を追加しようとしましたとウークラスへWoo fetch: "join"

HQLを使用する場合、私はかなり初心者ですが、パフォーマンスや大規模なクエリで重大な問題が発生しています。この問題に取り組むには良い方法がありますか?

+0

あなたはA' 'を反復処理するときは、また' A.foo'または 'A.bravo'から何かを読んでいます? 'toString'でもこれらのフィールドが読み込まれ、休止状態で読み込まれる可能性があります – Will

+0

これはgroovyかgrails/gormアプリケーションですか? – injecteer

答えて

1

GORM(Grailsフレームワークで使用されるORM)を使用しているようです。

問題を解決するには、最も一般的なユースケースが何であるかを判断する必要があります。デフォルトで遅延取得を継続したい場合は、A.findAllByUser(user, [fetch: join])が必要なときにフェッチ戦略をローカルで変更できます。

一方、デフォルトをeagerにフェッチするが、ローカルで無効にしたい場合は、1対多の関係でより安全であるため、fetch: joinの代わりにlazy: falseをドメインクラスに使用する必要があります。そして、あなたは、例えばA.findAllByUser(user, [lazy: true])(任意のクエリのためにそれを無効にすることができるはずです。

hereを参照してください。

+0

ありがとうございます。 – Petrogad

関連する問題