Printemps de Données PageImpl de ne pas retourner à la page avec la bonne taille?
Je suis en train de créer un nouveau Page
à l'aide d'une liste d'objets récupérés à partir de la base de données. J'ai d'abord obtenez tous les éléments à partir de la DB, de les convertir en un Flux de données, puis utiliser lambda pour filtrer les résultats. Alors j'ai besoin d'une Page avec un certain nombre d'éléments, cependant, l'instanciation d'un nouveau PageImpl
ne semble pas renvoyer une page avec la bonne taille.
Voici mon code:
List<Produtos> listaFinal;
Stream<Produtos> stream = produtosRepository.findAll().stream();
listaFinal = stream.filter(p -> p.getProdNome().contains("uio")).collect(Collectors.toList());
long total = listaFinal.size();
Page<Produtos> imp = new PageImpl<>(listaFinal,pageable,total);
Voici une capture d'écran de débogage:
Remarque la taille de l'Paginable objet est fixé à 20 et il comprend qu'il a besoin de 4 pages pour rendre le 70 éléments, mais il renvoie à l'ensemble de la liste.
Ce qui me manque?
Modifier répondre au commentaire de Thomas:
Je comprends comment utiliser la Page pour revenir simplement une tranche de données. Le code que j'ai montré a ma tentative d'utiliser une lambda expression de filtre de ma collection. Le problème pour moi est que je veux utiliser Java 8 lambda pour interroger la base de données via Spring Data JPA. Im utilisé pour VB.NET's et de l'Entité function(x)
les expressions de requête et je me demandais comment faire la même chose avec Spring JPA.
Dans mon référentiel, Im en utilisant extends JpaRepository<Produtos, Integer>, QueryDslPredicateExecutor<Produtos>
qui me donne accès à findAll(Predicate,Pageable)
. Toutefois, le Prédicat n'est pas tapé donc je ne peux pas tout simplement utiliser p -> p.getProdNome().contains("uio")
dans la requête. Je suis l'aide de SQL Server et de la mise en veille prolongée.
OriginalL'auteur dubonzi | 2014-11-03
Vous devez vous connecter pour publier un commentaire.
D'étendre stites réponse, un PagedListHolder est le chemin à parcourir, et voici comment:
Si vous avez besoin de trier, utiliser un autre PagedListHolder constructeur avec un MutableSortDefinition.
OriginalL'auteur Willi Mentzel
Après en avoir appris plus sur la façon de Printemps de Données fonctionne, j'ai fini par utiliser
@Query
annotations sur mes méthodes à l'intérieur de la JpaRepository implémentations de bien requête de la DB et de filtrer les résultats, éliminant la nécessité d'utiliser un cours d'eau et ensuite de les convertir retour à la Page.Voici comment le code ci-dessus seraient dans le cas où quelqu'un a besoin d'un exemple:
Im courant du Printemps
findBy
méthodes, mais parfois les noms de méthode devenir vraiment difficile à lire en fonction de la quantité de paramètres, donc j'ai juste collé à JPQL.De le faire de cette façon, le contenu de la Page sera toujours jusqu'à concurrence du montant maximum des éléments que vous avez défini dans la configuration Spring.
J'ai aussi utiliser une implémentation personnalisée de
PageImpl
, je ne suis pas au travail dès maintenant et ne pas avoir accès au code, mais je vais le poster quand je le peux.Edit: implémentation Personnalisée peut être trouvé ici
Pouvez-vous me donner le code que vous avez utilisé pour PageImpl. Je suis face à un même problème maintenant!
Code ajouté. Notez que cette mise en œuvre était nécessaire dans mon cas parce que j'avais affaire à un service REST, et le défaut de mise en œuvre ne fonctionnait pas pour moi, peut être différent dans votre cas.
Déplacé personnalisé de mise en œuvre à un autre site web depuis que l'autre était en bas.
OriginalL'auteur dubonzi
Si j'ai bien compris votre code à droite, puis votre intention est de le charger de tous les enregistrements de la base de données et de et de les diviser en x seaux qui sont recueillies dans le
PageImpl
, droit?Ce n'est pas la façon dont il l'habitude de travailler. L'intention réelle de l'
Pageable
etPage
l'abstraction n'est PASavoir à les interroger toutes les données, mais seulement la "tranche" de données qui est nécessaire.
Dans votre cas, vous pouvez interroger les données via
Page<X> page = repository.findAll(pageable);
et il suffit de le retourner.Page contient les enregistrements de la page en cours aux côtés de quelques informations supplémentaires comme par exemple, le nombre total d'enregistrements et si il y a une page suivante.
Dans votre code client, vous pouvez utiliser cette information pour afficher une liste de dossiers et la génération next /prev liens de façon appropriée.
Notez qu'une requête avec
Page<X>
comme résultat de type 2 requêtes (1 pour déterminer le nombre total de la requête et 1 pour la page de données).Si vous n'avez pas besoin de l'information sur le nombre total de résultats, mais veulent toujours être en mesure de générer un lien suivant vous devez
utilisation
Slice<X>
un type de retour depuis seulement les numéros 1 de la requête.Je suis confronté au même problème. Je dois utiliser un DTO à la carte la sortie de la requête à supprimer certaines colonnes masquées. J'ai donc d'abord obtenir tous les résultats et de les mapper le résultat à nouvelle sortie comme par DTO. puis-je utiliser PageImpl sur le nouveau résultat . Mais son montrant tous les enregistrements au lieu de paginé info.
OriginalL'auteur Thomas Darimont
PageImpl
n'est pas prévu pour tout type de pagination de votre liste. À partir de la documentation vous pouvez voir que c'est juste la "basePage
mise en œuvre", qui ressemble presque à ce que vous voulez, mais c'est vraiment trompeur.Utilisation
PagedListHolder
qui est un état simple support pour la manipulation des listes d'objets, en les séparant en plusieurs pages.OriginalL'auteur stites
après l'application de beaucoup de méthodes , c'était la solution dans mon cas, et ça fonctionne
OriginalL'auteur hatem htira
Je sais, c'est trop tard pour ajouter la réponse. Mais j'ai aussi été confronté à la même question & j'ai trouvé le moyen pour elle.
SimpleJpaRepository
a la méthodequi est utilisé pour le retour
Page<T>
dans le cas où vous êtes l'extension deJpaRepository
. Nous pouvons donc utiliser la même fonctionnalité (besoin de réécrire le code, alors que le Printemps ne vous donne pas la méthode publique pour avoir le plein de la pagination à l'appui).Si vous regardez la méthode
PageImpl<>(List<T> content, Pageable pageable, long total);
il suffit de le définir est la valeur que vous offrez danspageable
. Ici vous envoyezcontent
que la liste complète, mais le printemps n'est pas fait pour les internes. Besoin de remplacerPage<Produtos> imp = new PageImpl<>(listaFinal,pageable,total);
avec bloc de code suivant.Méthode getCountForQuery:
Vous pouvez trouver l'utilisation de
PageableExecutionUtils.getPage
dansméthode dans
SimpleJpaRepository
qui est surtout utilisé parfindAll
méthode interne.OriginalL'auteur AshwinK