1

(JPA/Hibernate の質問) 1 つのテーブルへのクエリがあります。それを「リリース」と呼びましょう。そこから 1 つの行を取得して、エンティティにマップします。このエンティティには 5 つの 1 対多の関連付けがあり、これらはすべて近い将来使用されるため、これらを熱心に取得したいと考えています。現在、これらの 1 対多の関連付けのそれぞれに、3 ~ 300 の間の行数があります。実際にクエリを実行すると、合計で約 100 万行が読み込まれます。

したがって、一般化された HQL クエリを少しプレビューします (括弧内にいくつかのコメントがあります)。

select rv, al, ... (blabla) from 
from Release rv 
left outer join fetch App app (on releaseId)
left outer join fetch Appconfig ac (on appId)
left outer join fetch Appbind ab (on appId)
left outer join fetch Releaseconfig rc (on releaseId)
left outer join fetch Somestuff st (on releaseId)
left outer join fetch Points p (on releaseId)
left outer join fetch Pointconfig pc (on pointId)
left outer join fetch Pointstuff ps (on pointId)
where rv.releaseId = :id

ここで、App には 100 行あり、Appconfig と Appbind は各 appId に対してそれぞれ 20 行あるとします。Releasconfig は約 15、Somestuff は約 20、Points はさらに 130、Pointconfig は各 Point に約 30、Pointstuff は各 Point に約 50 です。その結果、MASSIVE クエリが発生します。

クエリを分割して Hibernate にマップさせる方法はありますか? たとえば、最初に App、Appconfig、Appbind を要求し、次に Releaseconfig 自体と Somestuff を単独で要求し、次に Points、Pointconfig、および Poinstuff をすべて要求します...

ありがとう、クリス

4

1 に答える 1

0

これを行うには、App、Appconfig、Appbindなど、示したクエリを使用して必要なデータを事前にロードします。Hibernateに強制的にロードしていない他のすべてのコレクションは、プロキシによって表されます。

次に、次のコレクションが必要になったときHibernate.initialize()に、プロキシを渡してHibernateに強制的にロードさせることができます。これには、別のクエリが必要になります。

于 2012-06-28T14:35:21.897 に答える