web-dev-qa-db-ja.com

Spring Data JPAのページネーションでプロジェクションインターフェースを使用する方法

スプリングデータの新機能 projections を使用して、部分エンティティ(NetworkSimple)のページを取得しようとしています

私はドキュメントを確認しましたが、私がリクエストした場合のみ:

Collection<NetworkSimple> findAllProjectedBy();

動作しますが、ページング可能を使用している場合:

Page<NetworkSimple> findAllProjectedBy(Pageable pageable);

エラーをスローします:

org.hibernate.jpa.criteria.expression.function.AggregationFunction$COUNT cannot be cast to org.hibernate.jpa.criteria.expression.CompoundSelectionImpl

誰もがこれですでに働いていますか?

私のNetworkSimpleクラスは次のとおりです。

public interface NetworkSimple {
    Long getId();

    String getNetworkName();

    Boolean getIsActive();
}
13

注:この機能は、元のポスターで説明されている方法で動作するはずですが、 このバグ のため、動作しませんでした。ホッパーSR2リリースではこのバグが修正されています。以前のバージョンでスタックしている場合は、以下の回避策が機能します。

Spring Data JPA 1.10(Hopper)で導入された新しいクエリプロジェクション機能でPageableを使用することが可能です。 @Queryアノテーションを使用して、必要なフィールドのクエリを手動で作成する必要があります。また、Spring Dataが結果を投影する方法を理解できるように、ASを使用してエイリアスを付ける必要があります。 Spring Bootリポジトリの spring-boot-samples の部分に良い例があります。

あなたの例では、それは非常に簡単です:

@Query("SELECT n.id AS id, n.name AS networkName, n.active AS isActive FROM Network n")
Page<NetworkSimple> findAllProjectedBy(Pageable pageable);

私はあなたのエンティティが次のように見えると仮定しました:

@Entity
public class Network
{
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String name;

    @Column
    private boolean active;

    ...
}

Spring Dataは、ページング情報のカウントクエリを自動的に導出します。クエリで結合を使用して関連付けをフェッチし、プロジェクションでそれらを要約することもできます。

13
Robert Hunt

次のように、Pageableでインターフェースプロジェクションを使用できます。

Page<NetworkSimple> findPagedProjectedBy(Pageable pageable);

いくつかのパラメータ付き:

Page<NetworkSimple> findPagedProjectedByName(String name, Pageable pageable);
0
ema

Spring-data-jpa 1.11.4でも、次のようなもの

public interface NetworkRepository extends JpaRepository<Network, String> {
    Page<NetworkSimple> findAll(Pageable pageable);
}

コンパイルされません。報告

findAll(org.springframework.data.domain.Pageable) in NetworkRepository clashes with findAll(org.springframework.data.domain.Pageable) in org.springframework.data.repository.PagingAndSortingRepository
return type org.springframework.data.domain.Page<NetworkSimple> is not compatible with org.springframework.data.domain.Page<Network>

私たちが見つけた回避策は、findAllの名前をfindAll Byに変更することでした。

public interface NetworkRepository extends JpaRepository<Network, String> {
    Page<NetworkSimple> findAllBy(Pageable pageable);
}
0
Jean Marois

以下を使用できます。

@Query("SELECT n FROM Network n")
Page<? extends NetworkSimple> findAllProjectedBy(Pageable pageable);
0
Sergey

仕様としてfindAllProjectedBy()を作成する必要があると思います。このようにfindAll()メソッドを使用できます。

例:findAll(findAllProjectedBy(),pageable)

次のリンクは、春に仕様を作成する方法を見つけるのに役立ちます。

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

0
Hasitha Diluka

問題はメソッド名に起因している可能性があります。 byキーワードは、特定のプロパティ(findByNameなど)でデータをフィルタリングすることを意味します。メソッド名から呼び出されるクエリの作成:

http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation

Page<NetworkSimple> findAll(Pageable pageable);で試してください

0