を介して次のようにエンティティとの双方向の一又はゼロ対1のマッピングB.どのように怠惰な負荷一対一組成HQL
マッピングとエンティティAがある場合:
<class name="EntityA" table="TABLE_A" mutable="true" lazy="true">
<id name="idA" type="long" column="pk_a" unsaved-value="null">
<generator class="sequence">
<param name="sequence">pk_a_seq</param>
</generator>
</id>
<one-to-one name="propertyB" class="EntityB" property-ref="propertyA" constrained="true" outer-join="false"/>
</class>
と
<class name="EntityB" table="TABLE_B" mutable="true" lazy="true">
<id name="idB" type="long" column="pk_b" unsaved-value="null">
<generator class="sequence">
<param name="sequence">pk_b_seq</param>
</generator>
</id>
<many-to-one name="propertyA" class="EntityA" not-null="true" unique="true" lazy="proxy" column="fk_a"/>
</class>
私は、エンティティAのためのHQLクエリ(またはむしろ、名前付きHQLクエリ)を行うと、熱心に別のselect文でエンティティA#propertyBをロード休止状態。
私のhqlがEntityAの1000個のEntityAを持ち、EntityBがn + 1個のクエリを実行している場合(EntityAが1000個の結果を返す最初のクエリ、n個のクエリが来る) EntityA#propertyBからlazy loadingを選択します)。
しかし、私はこれらのEntityA#propertyBを必要としません。なぜなら、(別のSQLクエリを使用して休止しないで)代わりにそれらを読み込みたいからです。
これは可能ですか?それがあれば、どうしたらいいですか?
おかげで、 フランツ
私は問題を正確に理解していません。プロキシされたメソッドEntityA.getPropertyB()を呼び出すたびに、EntityAのセットに対してhqlを実行すると、対応するEntityA#propertyBが別のクエリを介してロードされます。これは通常の遅延ロードされた動作です。あなたは行動を正確に何にしたいですか? –
問題は、query.list()でn + 1を取得しているためです。私がsession.getNamedQuery( "myQueryString")。 .list()を実行すると、Hibernateは一致するすべてのEntityAをEntityA#getPropertyBで返します。熱心に初期化されました。 b。)EntityA#getPropertyB()は、別のselect文を使用して初期化されます。 したがって、1つのquery.list()では、すでにn + 1の問題が発生しています。私が(a。)か(b。)のどちらかを取り除くことができれば、私はn + 1を解決することができます。好ましくは、私は(a。) –