2

Hibernate のドキュメントに記載されているようにTABLE_PER_CLASS、ポリモーフィックな関係を取得するときにパフォーマンスが大幅に低下します

2.2.4.1. クラスごとのテーブル

この戦略には、JPA 仕様、Hibernate リファレンス ドキュメント、Hibernate in Action、および他の多くの場所で説明されている多くの欠点 (特にポリモーフィック クエリと関連付け) があります。Hibernate は、SQL UNION クエリを使用してこの戦略を実装し、それらのほとんどを回避します。一般的に、継承階層のトップ レベルに使用されます。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Flight implements Serializable { ... }            

この戦略は、1 対多の関連付けが双方向である場合にサポートします。この戦略は IDENTITY ジェネレーター戦略をサポートしていません。ID は複数のテーブルで共有する必要があります。したがって、この戦略を使用する場合は、AUTO も IDENTITY も使用しないでください。

しかし、このシナリオでは、継承戦略に他に選択肢がないため、クエリを改善する方法を探しています。Comment は、抽象 Commentable クラスに対して M:1 の関係を持つ具体的なクラスです。

私の希望は、それが参照している Commentable の具体的なタイプを区別できる識別子列を Commentに格納し、クエリ内で CASE を使用することでした。

@NamedQuery(name = "Comments.withItemTitle",
            query = "select c.commentBody, " +
                    "case " +
                    "when n.targetType = 'video' THEN (select v.title from Video v where v.id = c.target.id) " +
                    "when n.targetType = 'message' THEN (select m.title from Message m where m.id = n.target.id) " +
                    "when n.targetType = 'blog' THEN (select b.title from Blog b where b.id = n.target.id) " +
                    "end " +
                    "from Comment c")

しかし、休止状態は、ネストされた選択について、そのタイプを判別できないというエラーをスローします。これは postgre では合法のようです。Hibernate がネストされた SELECT 式をこのようにサポートしていれば、問題は解決しないでしょうか?

私の次のアイデアは、非正規化commentable.titleして各コメントに関連するものを保存することですが、明らかな理由でそれを行うのをためらっています. この質問の目的上、Commentable の継承構造を変更することはできません。

すべてのテーブルを一緒に UNION に休止状態にすることなく、このクエリを実行する他の方法はありますか?

4

1 に答える 1

0

問題は、JPQLにcaseステートメントがないことだと思います。を使用するようにコードを変更し、@NamedNativeQueryJPQLではなくSQLでクエリを書き直す必要があります。

于 2012-12-31T01:00:04.527 に答える