Introducción

1

Curso de Spring Data JPA con MySQL y RESTful API

2

Creación de Proyectos con Spring Initializer y Gradle

Primeros pasos

3

Conexión de Proyecto Java a Base de Datos MySQL en IntelliJ IDEA

4

Creación de Entidades con Hibernate en Java

5

Relaciones entre Entidades en JPA: OneToOne, ManyToOne, OneToMany

6

Consultas SQL con JDBC Template en Spring Boot

Spring Data Repositories

7

Uso de Spring Data Repositories para Gestión de Datos

8

Guardar y Actualizar Registros con Spring Data Repositories

9

Eliminar elementos con Spring Data JPA: método deleteById

10

Gestión de Relaciones en JPA: Lazy vs Eager Fetching

11

Query Methods en Spring para Consultas Personalizadas

12

Filtrado de Pizzas por Ingredientes usando Query Methods

13

Consultas Avanzadas con Query Methods en Java Spring

14

Uso de Query Methods para Filtrar y Ordenar Datos en Spring

15

Paginación y Ordenación con Spring Data Repositories

16

Ordenamiento Dinámico con Paging and Sorting Repository

Personalización de queries

17

Consultas de Base de Datos con JPQL en Spring Boot

18

Consultas SQL nativas y ordenación con Hibernate en Spring Data

19

Uso de Proyecciones en Queries Personalizados con Java y SQL

20

Actualización de Precios de Pizza con Spring Data JPA

21

Propiedades ACID y Spring Data: Uso de @Transactional

Características avanzadas

22

Auditoría de Entidades con Spring Data JPA

23

Auditoría de Entidades con Listeners Personalizados en Spring

24

Ejecución de Store Procedures en Spring Data

Próximos pasos

25

Fundamentos de Spring Data JPA: Conexión y Repositorios

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Uso de Query Methods para Filtrar y Ordenar Datos en Spring

14/25
Recursos

¿Cómo limitar registros con Query Methods en Spring?

Limitar registros al consultar bases de datos es una tarea fundamental para optimizar la performance de nuestras aplicaciones. En Spring, podemos lograrlo a través de los Query Methods. Estos métodos no solo nos permiten recuperar una cantidad específica de registros, sino también usar elementos de programación funcional como Optional para manejar respuestas.

Veamos cómo podemos implementar estas funcionalidades en un ejemplo práctico usando un proyecto de pizzería.

¿Cómo asegurarse de que solo un registro se recupere con Query Methods?

Para limitar la recuperación a un solo registro, no usaremos findAll, sino findFirst. Este método devuelve el primer registro que coincide con las condiciones definidas. En caso de necesitar más de un registro, findTop es la alternativa. Ambos métodos sirven para garantizar el manejo preciso de los datos.

Ejemplo de implementación:

public interface PizzaRepository extends JpaRepository<PizzaEntity, Long> {
    Optional<PizzaEntity> findFirstByAvailableTrue();
}

Esto permite obtener la primera pizza disponible. Recuerda ajustar la lógica en el servicio que llame a este método modificado.

¿Cómo integrar Optional en las consultas?

Optional es un potente aliado para manejar respuestas nulas o excepcionales en Java. Puede emplearse cuando llamamos a un Query Method que podría retornar un valor nulo. Si no se encuentra ningún resultado, podemos lanzar una excepción o devolver un valor por defecto.

Ejemplo de manejo de Optional:

Optional<PizzaEntity> optionalPizza = pizzaRepository.findFirstByAvailableTrue();
PizzaEntity pizza = optionalPizza.orElseThrow(() -> new RuntimeException("La pizza no existe"));

O, alternativamente:

PizzaEntity pizza = optionalPizza.orElseGet(() -> {
    // Lógica alternativa si la pizza no existe
    return new DefaultPizza();
});

¿Cómo encontrar las pizzas más baratas?

Podemos crear métodos para encontrar, por ejemplo, las tres pizzas más baratas. Utilizamos findTop3By para restringir la cantidad de registros. Asimismo, OrderBy permite ordenar estos registros según una propiedad, como el precio.

Ejemplo de búsqueda de pizzas económicas:

List<PizzaEntity> findTop3ByAvailableTrueAndPriceLessThanEqualOrderByPriceAsc(Double price);

Este método recupera las tres pizzas más baratas disponibles que cuestan menos de un valor dado, ordenándolas de manera ascendente.

¿Cómo invocar estos métodos desde el servicio?

Una vez definidos en el repositorio, invocamos estos métodos desde un servicio. Creamos un método que pase el precio como parámetro a nuestro Query Method.

public List<PizzaEntity> getCheapestPizzas(Double price) {
    return pizzaRepository.findTop3ByAvailableTrueAndPriceLessThanEqualOrderByPriceAsc(price);
}

¿Cómo verificar consultas en el controlador?

Finalmente, modificamos el controlador para permitir que los clientes consulten las pizzas más baratas al proporcionar un cierto precio:

@GetMapping("/pizzas/cheapest/{price}")
public List<PizzaEntity> getCheapestPizzas(@PathVariable Double price) {
    return pizzaService.getCheapestPizzas(price);
}

Esta consulta se ejecuta y devuelve las tres pizzas más económicas cumpliendo las condiciones mencionadas. Además, es importante revisar la consulta SQL que se genera y asegurarse de que los resultados se limiten adecuadamente.

Estos son algunos ejemplos de cómo se pueden utilizar los Query Methods para lograr búsquedas eficientes y personalizadas. Estimula explorar más sobre esta funcionalidad. Para profundizar, consulta los recursos adicionales que ofrecen documentación detallada. Continuar aprendiendo y explorando te permitirá sacar el máximo provecho de las poderosas herramientas de Spring.

Aportes 4

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Si les sale un error como a mi, deben cambiar el valor de la Columna Price a double, y aqui esta el metodo:

<    List<PizzaEntity> findTop3ByAvailableTrueAndPriceLessThanEqualOrderByPriceAsc(double price);
> 

Super! 👏🚀

En consola me sale esta consulta select p1\_0.id\_pizza,p1\_0.available,p1\_0.description,p1\_0.name,p1\_0.price,p1\_0.vegan,p1\_0.vegetarian from pizza p1\_0 where p1\_0.available and upper(p1\_0.name)=upper(?) fetch first ? rows only pero en postman no devuelve absolutamente nada, intenté controlar un posible error con try catch pero al parecer no hay error.