Mise en œuvre de la pagination des résultats en veille prolongée (nombre total de lignes)

StackOverflow https://stackoverflow.com/questions/1600215

Question

Comment implémenter la pagination dans Hibernate? Les La requête a méthodes appelées setMaxResults et setFirstResult qui sont certainement utiles. Mais où puis-je obtenir le nombre total de résultats afin de pouvoir afficher un lien vers la dernière page de résultats et d’imprimer des éléments tels que les résultats de 200 à 250 sur xxx ?

Était-ce utile?

La solution

Vous pouvez utiliser Query.setMaxResults (int results) et Query.setFirstResult (int offset).

Vous aussi: Il n’ya aucun moyen de savoir combien de résultats vous obtiendrez. Vous devez donc commencer par interroger avec "select count (*) ...". Un peu moche, à mon humble avis.

Autres conseils

Vous devez effectuer une requête distincte pour obtenir le nombre maximal de résultats ... et dans le cas où, entre le moment A du premier instant, le client envoie une demande de pagination au temps B lorsqu'une autre demande est émise, si de nouveaux enregistrements sont ajoutés ou certains enregistrements correspondent maintenant aux critères, vous devez alors interroger à nouveau le maximum pour refléter tel résultat. Je le fais habituellement en HQL comme ceci

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();

pour les requêtes Critères , je mets généralement mes données dans un DTO comme celui-ci

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE);
if(scrollable.last()){//returns true if there is a resultset
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1);
    criteria.setFirstResult(command.getStart())
            .setMaxResults(command.getLimit());
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list()));
}
scrollable.close();
return genericDTO;

vous pouvez effectuer deux requêtes: une requête de type count (*), qui devrait être peu coûteuse si vous ne joignez pas trop de tables, et une seconde requête dont les limites sont définies. Ensuite, vous savez combien d’éléments existent, mais ne récupérez que ceux qui sont visualisés.

Vous pouvez simplement définir MaxResults sur le nombre maximal de lignes à renvoyer. Il n'y a pas de mal à définir cette valeur plus grande que le nombre de lignes disponibles. Le problème des autres solutions est qu’elles supposent que l’ordre des enregistrements reste le même à chaque répétition de la requête et qu’il n’ya pas de changement entre les commandes.

Pour éviter cela, si vous voulez vraiment faire défiler les résultats, il est préférable d’utiliser les ScrollableResults. Ne jetez pas cet objet entre les pages, mais utilisez-le pour conserver les enregistrements dans le même ordre. Pour connaître le nombre d'enregistrements dans ScrollableResults, il vous suffit de passer à la dernière position (), puis d'obtenir le numéro de ligne. N'oubliez pas d'ajouter 1 à cette valeur, car les numéros de ligne commencent à compter à 0.

Personnellement, je pense que vous devriez gérer la pagination en front-end. Je sais que ce n’est pas si efficace, mais au moins ce serait moins sujet aux erreurs.

Si vous utilisiez la fonction count (*), que se passerait-il si les enregistrements étaient supprimés de la table entre les demandes d'une page donnée? Beaucoup de choses pourraient mal se passer de cette façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top