Curso de Spring Core
Aprende con el curso de Spring Core 5 a utilizar el motor de Spring para crear las mejores...
En esta ocasión te contamos cómo realizar la paginación de resultados al desarrollar una API REST, utilizando en este caso uno de los mecanismos que existen para ello.
La paginación de resultados es interesante de implementar cuando el número de resultado que vamos a hacer sobre una consulta es grande o muy grande, ya que es necesario no obtenerlos todos de golpe y dividirlos en lo que se denominan páginas.
Esto es así por dos razones:
Si hacemos una consulta, al final va a ir a una base de datos. Esto supone que desde el cliente se hace una petición a servidor, que a su vez manda una consulta a base de datos, que va a recoger los resultados, y que tardará en procesar si la consulta es compleja, y nos la va a devolver.
El conjunto de resultados, además, en bytes, puede que sea grande, dependiendo de lo que estemos consultando, y se lo devolvemos al cliente.
En todo ese proceso, aparte del tiempo que hemos tardado, posiblemente la carga sobre servidor sea bastante grande.
Seguramente, la experiencia de usuario también sea negativa. Primero por esa propia carga, ya que a todos nos da mucha pereza hacer algún click en alguna aplicación y que tarde mucho tiempo en responder.
En segundo lugar, por ejemplo, si lo que estamos haciendo es consultar productos en Amazon o en cualquier tienda online, o el timeline de Twitter, Instagram o de cualquier red social, si tenemos allí miles de cosas, lo que interesa es que no aparezcan todas a la vez, y que hasta que no se hayan mostrado todas, la aplicación no responda.
En este caso la experiencia de usuario sería bastante negativa, por ese motivo los resultados se suelen paginar y se obtiene un conjunto de resultados, y si queremos obtener más, diseñaremos algún mecanismo que a partir de ahí nos vaya ofreciendo diferentes páginas de resultados.
En Spring tenemos algunos elementos para poder hacer la paginación, como por ejemplo Spring Data JPA, que nos ofrece en sus repositorios la posibilidad de realizar consultas paginadas.
De hecho, la interfaz JpaRepository<T,ID>
, que es la que se suele extender en estos casos, a su vez extiende a PagingAndSortingRepository<T,ID>
, que es la que confiere la posibilidad de realizar paginación y ordenación de la salida de resultados.
De una manera sencilla, como son los repositorios de Spring Data JPA, complementariamente a lo sencillos que ya resultan, también de una manera sencilla tenemos la posibilidad de paginar nuestros resultados.
Tenemos disponibles, por ejemplo:
El método Page<T> findAll(Pageable pageable)
, al que se le proporciona un objeto de tipo Pageable.
El método Page<T> findByAlgo(Algo algo, Pageable pageable)
, ya que podemos diseñar en Spring Data JPA consultas derivadas en base al nombre de la propia consulta (ByAlgo
), pues le podemos pasar ese Algo y además siempre podemos pasar un objeto de tipo Pageable.
Todo ello lo tenemos disponible desde el PagingAndSortingRepository, dónde se definen este tipo de consultas, y JpaRepository, que hereda del mismo, también lo incorpora.
Para poder manejar esta paginación, tenemos algunas interfaces y clases que la implementan:
· Pageable
Como hemos visto anteriormente, Pageable
sería un elemento de entrada de la consulta, y es la información necesaria para saber qué página queremos extraer.
Por ejemplo, suponemos que dentro de nuestra base de datos tenemos 100 resultados y queremos obtener los 10 primeros. En este caso, a través de un objeto de tipo Pageable
tendremos que indicar que queremos la primera página, y que tendrá un tamaño de 10 resultados.
· Page<T>
Por otro lado, tenemos la interfaz Page<T>
, que es el resultado de una consulta paginada.
No es más una parte de la lista de todos los objetos que hay almacenados en la base de datos, una parte de esa lista, que además también tiene información sobre la lista completa, como, por ejemplo, el número total de páginas, el número total de elementos, etcétera.
Lo anterior lo tenemos dentro de Spring Data JPA, pero a nosotros los elementos de paginación los vamos a querer manejar desde los controladores, en nuestro caso de los controladores REST.
Spring Data Web Support nos permite usar clases de Spring Data JPA, en la capa web, es como el nexo de unión entre ambas capas.
De esta manera vamos a poder utilizar objetos de ese paquete de Spring Data dentro de los controladores, procesarlos para construir un objeto de ese tipo y poder utilizarlo para realizar las consultas dentro de nuestra API.
Un ejemplo sería el siguiente:
@RestController
public class ProductController {
…
@GetMapping(“/producto”)
public String index(Model model)
@PageableDefault(page=0, size=5) Pageable pageable) {
// …
}
…
}
Para implementar todo esto en un proyecto, teniendo incluidas las dependencias de Spring Data y Spring Web ya tendríamos todo el mecanismo necesario.
Se podría definir una consulta que fuese paginada de una manera muy sencilla, tal y como se puede ver en el ejemplo práctico del video, en el que paso a paso podrás ver todo el proceso.
También te puede interesar
Aprende con el curso de Spring Core 5 a utilizar el motor de Spring para crear las mejores...
Con este curso de Spring Boot y Spring MVC online y en español aprenderás a desarrollar tus propias...
Aprende con este curso a desarrollar una API REST utilizando para ello Spring Boot, desde cero hasta la...