2012-04-16 13 views
0

構成ファイルでuse_outer_joinオプションをtrueに設定しました。use_outer_joinオプション(真)は、外部結合を生成しません。

マップされたdbテーブルもあります。 sqlログでは、外部キーの場合、休止状態がレコードごとに個別の選択を生成していることがわかりました。プライマリ・テーブルからデータを取得するために結合を使用していません。

忘れたことはありますか? これ以外に何が間違えることがありますか?

ありがとうございました

答えて

1

はい、そうです。マッピングファイルで外部結合を指定するだけでは不十分です。

外部結合を強制したい場合は、それをHQL文で指定する必要があります。例

from firstTable as a outer join fetch a.secondTable as b where ... 
+0

あなたのソリューションは私のために働いていました。 (私はそのhsqlから "外側"を削除しなければならなかった)。 @Ram Reddyの解決策がなぜ機能しなかったのか不思議です。 hibernateに外部テーブルとの結合を使用させるには、常にテーブルを明示的に結合する必要がありますか? – John

+0

はい、する必要があります。マッピングファイルでのみ結合を指定すると、hibernateはこれを '結合のようにすべきです'と解釈し、結合された文と同じ効果を持つ2つの異なるselect文を実行します。私は理由はわかりませんが、それは遅延読み込みの哲学によると思います。結合されたデータが使用されていない場合は、ロードする必要はありませんが、明示的な結合では常にロードされます。結合されたデータが使用されることが確実であれば、特にデータベースがアプリケーションとは別のコンピュータにある場合は、HQLステートメントの明示的な結合が高速になります。 – Johanna

+0

お返事ありがとうございます。良い一日を過ごしてください :) – John

0

あなたの関係マッピングを確認してください。何も指定されていない場合は、デフォルトでプロキシが返され、プロキシにアクセスすると、その子はロードされます。これは、別のSQLセレクトでロードされます。

コレクションマッピングで「outer-join = true」を使用する必要があります。 (hibernate.use_outer_joinがコンフィグレーションでtrueで、コレクションマッピングがouter-join = "true"の場合... hibernateだけが外部結合を生成します)。

+0

のために、私は多対一プロパティのコレクション・マッピングで設定した、真のために外部結合属性、私はまた、属性ました:フェッチ=「参加」ともに設定された構成ファイルuse_outer_joinに真でありながら、まだHibernateはソーステーブルのすべての行に対して選択を行っていました。 (hsqlはちょうど "テーブルから"です)... – John

関連する問題