スプリングデータの新機能 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();
}
注:この機能は、元のポスターで説明されている方法で動作するはずですが、 このバグ のため、動作しませんでした。ホッパー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は、ページング情報のカウントクエリを自動的に導出します。クエリで結合を使用して関連付けをフェッチし、プロジェクションでそれらを要約することもできます。
次のように、Pageableでインターフェースプロジェクションを使用できます。
Page<NetworkSimple> findPagedProjectedBy(Pageable pageable);
いくつかのパラメータ付き:
Page<NetworkSimple> findPagedProjectedByName(String name, Pageable pageable);
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);
}
以下を使用できます。
@Query("SELECT n FROM Network n")
Page<? extends NetworkSimple> findAllProjectedBy(Pageable pageable);
仕様としてfindAllProjectedBy()
を作成する必要があると思います。このようにfindAll()
メソッドを使用できます。
例:findAll(findAllProjectedBy(),pageable)
次のリンクは、春に仕様を作成する方法を見つけるのに役立ちます。
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
問題はメソッド名に起因している可能性があります。 byキーワードは、特定のプロパティ(findByNameなど)でデータをフィルタリングすることを意味します。メソッド名から呼び出されるクエリの作成:
Page<NetworkSimple> findAll(Pageable pageable);
で試してください