3

単一テーブル継承戦略を実装する次の2つのクラスがあります。

@Entity
@Table(name = "tableA")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("A")
class A {
    ...
}

@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("B")
class B extends A {
    ...
}

すべてのAエンティティをフェッチするクエリを作成すると、Bエンティティも取得されます。タイプAのエンティティのみをフェッチする方法は?

4

1 に答える 1

2

次のように、一般的な抽象基本クラスを作成し、A と B の両方を基本に拡張できます。

@Entity
@Table(name = "tableA")
@DiscriminatorColumn(name="`type`")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
abstract class Base {
    ...
}

@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("A")
class A extends Base {
    ...
}

@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("B")
class B extends Base {
    ...
}

( SINGLE_TABLE がデフォルトの戦略であるため、注釈パラメータを省略できることに注意してください)。

または JPA2 がサポートされている場合は、次のものを利用できます。

SELECT a FROM A a WHERE TYPE(a) = A
于 2013-01-09T13:44:24.477 に答える