1

Joined継承戦略でOpenJPAを使用しています(InheritanceType.JOINED-スーパークラスのすべてのフィールドに単一のテーブルがあり、サブクラステーブルには、サブクラスに追加されたすべてのフィールドと、スーパークラスへの参照が含まれていますテーブル)。スーパークラスの Person と、いくつかのサブクラス (TypeAPerson、TypeBPerson など) があるとします。次のようなクエリがある場合:

@NamedQuery(
name="Person.findByName", 
query="SELECT p FROM Person p WHERE p.name = :name")

私の知る限り、Person インスタンスではなく、適切なサブクラス インスタンスを取得します。hereで述べたように、これを達成して適切なサブクラスを取得するために、OpenJPA は複数の結合 (サブクラスごとに 1 つ) を行います。特にサブクラスが多い場合、これはパフォーマンスが非常に悪くなります。私の質問は、JPAに参加するテーブルのヒントを与えることでこれを回避する方法があるかどうかです? 最初に頭に浮かぶのは、Discriminator 値の使用です。OpenJPA は Joined 戦略を持つ Discriminator を持つことをサポートしているので、discriminator の値からサブクラス (したがって、結合するための適切なテーブル) を決定できるはずですか? これを達成する方法はありますか?不要なデータベース結合を回避する他の方法はありますか?

4

1 に答える 1

1

単一のサブクラスのエンティティのみが必要な場合、余分な結合を避ける最善の方法は、このサブクラスをクエリすることです。あなたの例を使用すると、次のようになります。

@NamedQuery(
name="Student.findByName", 
query="SELECT s FROM Student s WHERE s.name = :name")

StudentのサブクラスですPerson。もちろん、名前付きクエリは適切なサブクラスで定義する必要があります。

スーパークラス クエリを使用し、単一のサブクラス テーブルのみを結合するという、両方の方法を使用する方法はありません。永続化プロバイダーは事前に結果を認識していないため、正しい方向にヒントを与える唯一の方法は、サブクラスを検索することです。

編集:正確なサブクラスがわからないが、可能なサブクラスを制限できる場合は、次のように IN 句で JPQLTYPEキーワードを使用できます。

queryString="SELECT p FROM Person p WHERE p.name = :name AND TYPE(p) IN (Student, Teacher)"

のパラメータとしてエンティティ名を使用しますTYPE。私の知る限り、大文字と小文字が区別されます。クエリを実行していないため、実際の識別子の型と値は重要ではありません。型解決はプロバイダーによって行われます。

ただし、プロバイダーが必要な結合を制限できるようになるかどうかはわかりません。それを使用またはベンチマークすることになった場合は、そうであるかどうか教えてください。

于 2013-01-16T14:17:44.667 に答える