2

ItemData、および DTO クラス の2 つのエンティティがありItemDataます。ItemDataで構成され、JPA マッピングはありませんItemDataデータが入力された ItemData のリストを取得するには、JPQL でコンストラクター式を使用します。

select new my.package.ItemData(i, d)
from Item i, Data d
where i.id = d.itemId

これが Hibernate が行っていることです: と の両方のデータを取得する代わりに、Item最初Dataに ID を取得し、その後n 個の select ステートメントでデータを取得します。この動作を変更する方法はありますか?

Hibernate:
    select
        item0_.id as col_0_0_,
        data1_.id as col_1_0_ 
    from
        ITEM item0_,
        DATA data1_

Hibernate: 
    select
        item0_.no as no1_0_,
        item0_.description as description1_0_,
        item0_.organic as bio1_0_,
        item0_.gluten as gluten1_0_,
        item0_.laktose as laktose1_0_
    from
        ITEM item0_ 
    where
        item0_.id=?

Hibernate: 
    select
        data0_.amount as amount1_3_0_,
        data0_.avg as avg3_0_,
        data0_.total as total3_0_
    from
        DATA data0_ 
    where
        data0_.id=?

Hibernate: 
    select
        item0_.no as no1_0_,
        item0_.description as description1_0_,
        item0_.organic as bio1_0_,
        item0_.gluten as gluten1_0_,
        item0_.laktose as laktose1_0_
    from
        ITEM item0_ 
    where
        item0_.id=?

Hibernate: 
    select
        data0_.amount as amount1_3_0_,
        data0_.avg as avg3_0_,
        data0_.total as total3_0_
    from
        DATA data0_ 
    where
        data0_.id=?

...and so on...        
4

2 に答える 2

2

左結合フェッチの使用についてはどうですか?
CTOR 式を使用しなかったことは認めますが、親エンティティとその子エンティティをフェッチする必要がある場合は、左結合フェッチを使用し、常に魅力的に機能しました。
ここではオブジェクトの構築を扱っているため、
Hibernate は「部分的に構築された」オブジェクト (または、「遅延評価状態」のオブジェクト) を「残したくない」と想定することしかできません。 「左結合フェッチ」を使用して「イーガー フェッチ」を実行すると、N+1 フェッチが実行されます。
最初にすべての ID がフェッチされ、次に関連する ID ごとに別のフェッチが実行されます。
left join fetch の詳細については、こちらをご覧ください (ページで「left join fetch」を探してください)。

于 2012-10-08T12:50:15.627 に答える