2

現在、データベースクエリにQueryDSLを使用していますが、質問はより一般的に休止状態に関連していると思います..

私は疑問に思っています: HQL は、クエリを実行するエンティティを休止状態のコンテキスト/キャッシュに配置して、そこからアクセスできるようにしますか? エンティティに対してビッグを実行し、leftjoinすべての子関係を明示的に収集する場合、結果をエンティティ オブジェクトにマッピングするときにその情報を使用するように hibernate に指示できれば、遅延読み込みを節約できるはずだと考えています。方法がわかりません..

例: A には B があり、B には C があります。ここで、特定の A に対してクエリを作成し、fetch allそれを B および C と結合すると (クエリ DSL 実装):

List<A> as = query.from(QA.a).leftJoin(QA.a.b,QB.b).leftJoin(QB.b.c,QC.c).where(a.id.eq("1)).fetchAll();

私は言う素敵なSQL文を取得します

select... from A inner join B ... inner join C ... where ...

したがって、休止状態が初期化するのに十分な結果が得られるはずです

as.get(index).getBs()
as.get(index).getBs().get(index).getCs()

代わりにクエリを実行します

select ...  from B where B.aId = ??

1回の結合ですべての子を持つエンティティを初期化することで、これらの遅延読み込みを減らすことはまったく可能ですか?

結合を使用してすべてのデータをロードすると、休止状態はそれらをキャッシュに保持し、それらの遅延ロードのためにそのキャッシュにアクセスしますか、それともデータベースをポーリングしますか? 私はそれについて発言権を持っていますか、それとも完全に私の手に負えませんか?

皆さんありがとう!

4

2 に答える 2

4

HQL クエリでは、fetchキーワードを使用してそれを行う必要があります。

select a from A a left join fetch a.cs b left join fetch b.cs where ...

これは、Hibernate のドキュメントで詳しく説明されています。

私は QueryDSL を使用したことがありませんが、そのドキュメントによると、各結合後に fetch() メソッドを呼び出して、この fetch キーワードを追加するだけで済みます。

query.from(QA.a).leftJoin(QA.a.b,QB.b).fetch().leftJoin(QB.b.c,QC.c).fetch().where...
于 2012-06-25T14:32:11.737 に答える
1

申し訳ありませんが、投稿でこれを言及するのを忘れていました。使用してみfetchましたが、成功しませんでした。解決策は使用することです

@Fetch(FetchMode.JOIN)

エンティティ プロパティで。

于 2012-06-26T08:55:27.953 に答える