Comment faire pour utiliser la projection des interfaces avec la pagination dans Spring Data JPA?
Que j'essaie de faire une page d'un partiel de l'entité (NetworkSimple) à l'aide de la nouvelle fonctionnalité de printemps de données, les projections
J'ai vérifié la documentation et si je demande seulement:
Collection<NetworkSimple> findAllProjectedBy();
Il fonctionne, mais si je suis en utilisant paginable:
Page<NetworkSimple> findAllProjectedBy(Pageable pageable);
Il renvoie une erreur:
org.hibernate.jpa.criteria.expression.function.AggregationFunction$COUNT cannot be cast to org.hibernate.jpa.criteria.expression.CompoundSelectionImpl
Quelqu'un a déjà travailler avec cela ?
Mon NetworkSimple classe est la suivante:
public interface NetworkSimple {
Long getId();
String getNetworkName();
Boolean getIsActive();
}
Vous devez vous connecter pour publier un commentaire.
Remarque: Cette fonctionnalité devrait fonctionner de la manière décrite par le posteur d'origine, mais en raison de ce bug il n'a pas. Le bogue a été corrigé pour la Trémie SR2, si vous êtes coincé sur une version antérieure, puis la solution de contournement ci-dessous.
Il est possible d'utiliser
Pageable
avec la nouvelle requête de projection fonctionnalités introduites dans Spring Data JPA 1.10 (Trémie). Vous aurez besoin d'utiliser la@Query
d'annotation et d'écrire manuellement une requête pour les champs dont vous avez besoin, ils doivent également être lissés à l'aide deAS
pour permettre de Données du Printemps à comprendre comment le projet les résultats. Il y a un bon exemple dans spring-boot-échantillons le cadre du printemps de démarrage référentiel.Dans votre exemple, il serait assez simple:
J'ai fait l'hypothèse que votre entité ressemble à quelque chose comme ceci:
Printemps de Données permettra de tirer un nombre de requêtes automatiquement pour l'échange d'informations. Il est également possible d'utiliser des jointures dans les requêtes pour extraire des associations, puis de les synthétiser dans la projection.
Le problème peut venir du nom de la méthode. Le mot-clé signifie que vous ae filterig données par une propriété particulière: findByName par exemple. Elle est appelée la création de requêtes à partir de la méthode nom:
http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation
Donc, essayez avec
Page<NetworkSimple> findAll(Pageable pageable);
org.springframework.data.mapping.PropertyReferenceException: No property findAllProjected found for type Network!
Je pense que vous avez besoin de créer
findAllProjectedBy()
spécification.Ensuite, vous pouvez utiliserfindAll()
méthode comme ceci.exemple :
findAll(findAllProjectedBy(),pageable)
Lien suivant peut vous aider à trouver la façon de créer de la spécification au printemps.
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
Vous pouvez utiliser:
Même avec spring-data-jpa 1.11.4, quelque chose comme
ne serait pas de la compilation; l'établissement de rapports
La solution que nous avons trouvé a été de renommer findAll à findAllPar, par exemple
Vous pouvez utiliser l'interface de projection avec Paginable comme ceci :
avec un certain nombre de paramètres :