book

Paginar y ordenar es realmente sencillo con el framework Spring. Voy a mostrar un ejemplo en el que voy a filtrar una lista de hoteles por la ciudad en la que están ubicados y paginar, recuperando la cantidad de valores que nos interesa.

En éste ejemplo no trataré sobre como guardar la información en base de datos. Si queréis una explicación mas detallada sobre como lo llevo a cabo, podéis encontrarlo aquí.

Dependencias

Las dependencias principales serán spring boot starter web para proporcionarnos la API con la que crear una interfaz Web y spring boot starter data jpa, que nos facilita la lectura/escritura de información en base de datos.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Repositorio

Spring data nos proporciona las interfaces “Page” y “Pageable” para poder paginar. Únicamente deberemos recuperar el objecto Page y pasar un objeto de tipo Pageable como parámetro respectivamente.
Para ello, añadiremos la declaración del método “findByCity”.

package com.juanmorschrott.hotel.repository;

import com.juanmorschrott.hotel.model.Hotel;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;


public interface HotelRepository extends CrudRepository<Hotel, String> {

    Page<Hotel> findByCity(String city, Pageable pageable);

}

Controlador

Mediante una petición HTTP POST que incluya los query values tanto para la búsqueda “city”, como para la paginación “start” y “limit”, podemos obtener los resultados deseados.

package com.juanmorschrott.hotel.controller;

import com.juanmorschrott.hotel.model.Hotel;
import com.juanmorschrott.hotel.repository.HotelRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
@RequestMapping("/api/v1/hotels")
public class HotelController {

    @Autowired
    private HotelRepository hotelRepository;

    ...
    
    @PostMapping()
    public ResponseEntity findByCity(@RequestParam("city") String city,
                                     @RequestParam("start") Integer start,
                                     @RequestParam("limit") Integer limit) {

        if (city == null || start == null || limit == null) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }

        Pageable firstPage = PageRequest.of(start, limit);

        Page<Hotel> hotels = hotelRepository.findByCity(city, firstPage);

        if (hotels.getTotalPages() > 0) {
            return new ResponseEntity<>(hotels.getContent(), HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

}

Resultado

Una vez completado, al arrancar nuestro servicio y lanzar la petición, podemos comprobar que funciona correctamente:

Conclusión

Hemos visto de manera rápida como paginar mediante Spring Boot JPA.
Podéis encontrar el ejemplo aquí.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate