6

JPAプロバイダーとしてEclipseLinkを使用しています。さらに、次のTABLE_PER_CLASS継承構造を使用しています

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@NamedQueries({
    @NamedQuery(name=Parent.QUERY_FIND_ALL, query="SELECT p FROM Parent p")
})
public class Parent {
        // the class code follows here
}

@javax.persistence.Entity 
@NamedQueries({
    @NamedQuery(name=Child.QUERY_FIND_ALL, query="SELECT c FROM Child c")
})

public class Child extends Parent {
        // the class code follows here
}

問題は、親クラスのエントリのみを受け取りたいということです。ただし、名前付きクエリ「SELECT p FROM Parent p」を使用すると、子テーブルのすべてのエントリも返されます。

選択または検索コードは次のとおりです。

public List findWithNamedQuery(String query) {
        return em.createNamedQuery(query).getResultList();
}

これにより、クエリは「SELECT pFROMParentp」になります。

この継承階層のすべてのエントリではなく、実際に親エントリのみを受信するにはどうすればよいですか?

つまり、すべての子エントリをそのままにして、親エントリのみを返すにはどうすればよいですか?

編集1:
EclipseLink 2.0.1を使用していますが、型式を使用してaxtavtのソリューションを試すたびに、次のエラーが発生します。

"Invalid Type Expression on [my.domain.Parent].  The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance".

EclipseLinkの最新の安定バージョン2.1.1にも更新しましたが、問題は解決しません。

4

2 に答える 2

8

ご使用の EclipseLink のバージョンが JPA 2.0 をサポートしている場合は、次のように記述できます。

SELECT p FROM Parent p WHERE TYPE(p) = Parent
于 2010-11-23T13:26:03.730 に答える
4

TABLE_PER_CLASS 継承と組み合わせた Type 式は、EclipseLink 2.1.1 では機能しません。これはバグのようです。

JPA 2.0への回答も参照してください: TYPE 式の例外

于 2010-12-02T14:19:07.680 に答える