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();
}
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.
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);
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);
}
Sie können verwenden:
@Query("SELECT n FROM Network n")
Page<? extends NetworkSimple> findAllProjectedBy(Pageable pageable);
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/
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:
Also versuche es mit Page<NetworkSimple> findAll(Pageable pageable);