3

MySQLデータベースでHibernate 3を使用しています(Hibernate 4で試しましたが、成功しませんでした)。具体的なクラスごとのテーブル継承戦略 (ユニオン サブクラス) を実装しました。

多態的なクエリを除いて仕事をします。Hibernate は、「where」句が高レベルのクエリにある UNION ベースのクエリを生成します。

select primKey, param1, param2 from (
    select primKey, param1, param2 from Concrete1
    union
    select primKey, param1, param2 from Concrete2
)
where primKey == <value>
order by param1
limit 100

これにより、具象テーブルのコンテンツ全体がロードされるため、パフォーマンスが非常に低下しますが、pkey は抽象的な親の属性であるため、サブセレクトで「where」句を定義できます。

したがって、目的は、Hibernate がこの種のクエリを生成するようにすることです。

select primKey, param1, param2 from (
    select primKey, param1, param2 from Concrete1 where primKey == <value>
    union
    select primKey, param1, param2 from Concrete2 where primKey == <value>
)
order by param1
limit 100

このようにして、クエリは瞬時に実行されます。

この動作を変更するために Hibernate を構成する方法について何か考えはありますか?

ありがとう

Y.

4

1 に答える 1

0

私はかつて同様のパフォーマンスの問題に苦しんでいましたが、(少なくとも当時は)実装を「クラス階層ごとのテーブル」に切り替えることが唯一の解決策であることがわかりました。これにより、ユニオンや結合が不要になるため、パフォーマンスが大幅に向上します。きちんとしたスキーマではありませんが、いくつかのサブクラスしかない場合は、良い代替手段になる可能性があります。

于 2013-05-09T19:31:30.703 に答える