2017-05-15 6 views
3

私はJPAとJPAエンティティの階層を持っては継承に参加しましたqueryByExampleにこのようなPageRequest:それは私がを設定している場合を除いて、正常に動作します春データページング可能ソートJPA弁別フィールド上

Example<Product> example = ... 
PageRequest pageRequest = ... 
Page<Product> productPage = productRepository.findAll(example, pageRequest); 

pageRequestのを「タイプ」(@DiscriminatorColumn)としてください。

  • が直接エンティティにタイプフィールドを追加します。

    私がしようとしました。この方法ではクエリはうまく動作しますが、永続操作は失敗し、org.postgresql.util.PSQLException: The column index is out of range: 11, number of columns: 10で失敗します。

  • 私は、@Transientとして持続作品をこのフィールドをマークしますが、クエリは私にこの例外を与える場合:Unable to locate Attribute with the the given name [type] on this ManagedType [...AbstractEntityWithDate](AbstractEntityWithDateがcreationDatemodificationDateを含む、Product@MappedSuperclassです)

私はspring-を使用していますバージョン1.4.5.RELEASEは、spring-data-jpa(1.10.8.RELEASE)とhibernate(5.0.12.Final)の依存関係管理バージョンでサポートされています。

ディスクリミネータフィールドによる並べ替えは、Pageableでどのように設定できますか? (私はこのためにカスタム@Queryを書いたくありません)。

+1

JPQLでは弁別子フィールドを使用できないため、Springでは使用できません。クラス表現がない列を使用する唯一の方法は、ネイティブクエリを使用することです。 –

+0

ありがとうございます!私はこれに完全に同意していませんが(JPAとt.classのタイプ(t)が休止状態の回避策としてあります)、この回避策を見つける手助けをしました: https://theodoreyoung.wordpress.com/2011/08/ 08/jpa-and-hibernate-problems-with-polymorphic-queries/ それは私のために働くように見え、しばらくの間より良い答えが到着しなければ、私は答えとしてこれを掲示するでしょう。 –

答えて

4

弁別列は、読み取り専用のエンティティとしてマッピングすることができ

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING) 
class Product { 
    @Column(name = "TYPE", insertable = false, updatable = false) 
    private String type; 
} 

が続いて、次のクエリが動作します属性:on Github利用可能

productRepository.findAll(new Sort("type")) 

ワーキングサンプル。


休止状態(typeは常にnullになります)で動作しませんJOINED継承戦略コードで識別値を使用しようとすると、このように述べました。これは伝統的にHibernateが@DiscriminatorColumnJOINEDHHH-6911を参照)にサポートしておらず、v4.2.9以降で継承された継承の列値を保存し始めたからです。値が正しく保存されていても、弁別子列の値を読み取らないバグがまだ残っているようです。

+0

ありがとう!基本的に私は同じ回避策を見つけましたが(OPコメントにリンクされているもの)、この回答は他の有用な情報と実際のコード例でも拡張されていますので、正しい答えが得られます:) –

+0

@ C-Shark、以前のコメントに注意を払う。以前にリンクされたコンテンツを見た場合、私は答えを投稿していないでしょう。私は最初、コメントとしての読み取り専用属性のビットを投稿したいと思っていましたが、HHH-6911への注意を引くことを望んでいました。これは何度か焼いてしまったものです。回答。答えを受け入れることに感謝します。 – manish

関連する問題