TL;DR
B コレクションにいくつかのプロパティしかない単一の A オブジェクトを取得するにはどうすればよいですか?
説明
私は、人々がすべての関係をEAGERとしてマッピングするという素晴らしいアイデアを持っていたレガシープロジェクトに取り組んでいます.
現在、パフォーマンスの問題が発生しています。
たとえば、B オブジェクトのリストを持つクラス A があります。そのリストは、休止状態のバッグとしてマップされ、遅延ロードされます (これまでのところ、非常に良好です)。問題は、B がおかしなアルファベット全体を熱心にロードすることです。
A.hbm.xml
<hibernate-mapping>
<class="A" table="a" lazy="false">
// properties
<bag name="listOfBs" inverse="true">
<key column="a_id" [...]>
<one-to-many class="B" />
</bag>
</hibernate-mapping>
B.hbm.xml
<hibernate-mapping>
<class="B" table="b" lazy="false">
<many-to-one name="a" class="A" column="a_id" />
// lots of other many-to-one mappings
// properties
// lots of one-to-many properties
</hibernate-mapping>
したがって、必要な B のプロパティは 4 つだけですが、関連するすべてのオブジェクトがフェッチされます!
すべてを壊さずにこれを解決するために、hqlクエリを使用してコレクションのいくつかの列のみを選択しようとしています:
"select a, b.field1, b.field2, b.field3, b.field4
from A a inner join B b where a.id = :id"
ただし、一意の結果が必要なため、次のクエリで例外が発生します。