wake-up-neo.com

Wie werden Projektionsschnittstellen mit Paginierung in Spring Data JPA verwendet?

Ich versuche, eine Seite einer Teilentität (NetworkSimple) mit der neuen Funktion der Federdaten zu erhalten, Projektionen

Ich habe die Dokumentation überprüft und wenn ich nur verlange:

Collection<NetworkSimple> findAllProjectedBy();

Es funktioniert, aber wenn ich pageable benutze:

Page<NetworkSimple> findAllProjectedBy(Pageable pageable);

Es wird ein Fehler ausgegeben:

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

Hat jemand schon damit gearbeitet?

Meine NetworkSimple-Klasse ist folgende:

public interface NetworkSimple {
    Long getId();

    String getNetworkName();

    Boolean getIsActive();
}
10

Hinweis: Diese Funktion sollte auf die vom ursprünglichen Poster beschriebene Art und Weise funktionieren, aber aufgrund von diesem Fehler war dies nicht der Fall. Der Fehler für das Release von Hopper SR2 wurde behoben. Wenn Sie eine ältere Version verwenden, funktioniert die unten beschriebene Problemumgehung.

Pageable kann mit den neuen in Spring Data JPA 1.10 (Hopper) eingeführten Abfrageprojektionsfunktionen verwendet werden. Sie müssen die Annotation @Query verwenden und manuell eine Abfrage für die von Ihnen benötigten Felder schreiben. Sie müssen auch einen Aliasnamen mit AS haben, damit Spring Data herausfinden kann, wie die Ergebnisse projiziert werden. Es gibt ein gutes Beispiel in Spring-Boot-Samples Teil des Spring Boot-Repositorys.

In Ihrem Beispiel wäre das ganz einfach:

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

Ich habe angenommen, dass Ihre Entität ungefähr so ​​aussieht:

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

    @Column
    private String name;

    @Column
    private boolean active;

    ...
}

Spring Data leitet automatisch eine Zählerabfrage für die Paging-Informationen ab. Es ist auch möglich, Verknüpfungen in der Abfrage zu verwenden, um Assoziationen abzurufen und diese dann in der Projektion zusammenzufassen.

11
Robert Hunt

Sie können die Oberflächenprojektion mit Pageable wie folgt verwenden:

Page<NetworkSimple> findPagedProjectedBy(Pageable pageable);

mit einigen Parametern:

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

Auch mit Spring-Data-jpa 1.11.4 ähnelt das

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

würde nicht kompilieren; Berichterstattung 

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>

Die Problemumgehung bestand darin, findAll umzubenennen, um All By zu finden, z.

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

Sie können verwenden:

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

Ich denke, Sie müssen findAllProjectedBy() als Spezifikation erstellen. Dann können Sie die findAll()-Methode wie folgt verwenden.

beispiel: findAll(findAllProjectedBy(),pageable)

Der folgende Link kann hilfreich sein, um herauszufinden, wie Sie die Spezifikation im Frühjahr erstellen.

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

0
Hasitha Diluka

Das Problem kann aus dem Methodennamen stammen. Das by-Schlüsselwort bedeutet, dass Sie die Daten nach einer bestimmten Eigenschaft filtern: findByName zum Beispiel. Die so genannte Abfrageerstellung aus dem Methodennamen:

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

Also versuche es mit Page<NetworkSimple> findAll(Pageable pageable);

0