1

マップされたスーパークラスで NamedQuery を宣言しようとしていますが、次のエラーが発生します。

org.hibernate.hql.ast.QuerySyntaxException: VoipCall がマップされていません [VoipCall v から v.audioFile = :audioFile を選択]

休止状態を使用しますが、JPA 標準表記を使用することを好みます。

コードは次のとおりです。

@MappedSuperclass
@NamedQueries(value = {
    @NamedQuery(name = "getVoipCallsForAudio", query = "select v from VoipCall v where v.audioFile = :audioFile")
})
public abstract class VoipCall implements Serializable {

クエリでマップされたSuperClassを使用できないようですが、JPA APIでこれを見つけた場合の理由がわかりません:

NamedQuery アノテーションは、エンティティまたはマップされたスーパークラスに適用できます。

どこが間違っていますか?

ありがとう!!

解決策: 私にとっての解決策は回避策でした。名前付きクエリをサブクラスに移動し、適宜 where 句を変更しました。私の観点からすると、これによりコードの保守性が低下しますが、別の方法ではできません。

4

1 に答える 1

3

@NameQueryに注釈を付けても問題ありません@MappedSuperClass。過去に Hibernate には問題HHH-4364があり、これが失敗する原因でした。問題は何年も前から修正されています。

一方、マップされたスーパークラスはクエリできないため、クエリ自体は機能しないと予想されます。JPA 2.0仕様では、これは次の言葉で伝えられています。

エンティティとは異なり、マップされたスーパークラスはクエリ可能ではなく、EntityManager またはクエリ操作に引数として渡してはなりません。

この制限は理にかなっています。マップされたスーパークラスの目的は、関連のないエンティティ間でマッピングを共有することです。マップされたスーパークラスは、エンティティ継承階層のルートになることは想定されていません。このようなクエリが機能する場合、それは純粋に JPA ベンダー固有の拡張機能によるものです。

于 2013-05-07T18:56:43.353 に答える