Query Methods con OR, BETWEEN y ORDER BY

Clase 23 de 31Curso de Java: Backend con Spring Boot

Contenido del curso

JPA con Spring y Spring Data

Resumen

Dominar las sentencias dentro de los query methods de Spring Data permite construir consultas complejas sin escribir SQL puro. Aquí se explica paso a paso cómo utilizar LIKE, OR, BETWEEN, ORDER BY y Containing directamente desde la interfaz del repositorio, logrando búsquedas flexibles y ordenamientos personalizados sobre entidades JPA.

¿Cómo funciona el query method con LIKE en Spring Data?

El primer query method que se construye utiliza la sentencia LIKE, equivalente al WHERE ... LIKE de SQL. En la interfaz UserRepository se define así [1:07]:

java List<User> findByNameLike(String name);

Al invocar este método desde la clase FundamentosApplication, es necesario envolver el parámetro entre operadores de porcentaje para que funcione correctamente [1:30]:

java userRepository.findByNameLike("%user%") .stream() .forEach(user -> logger.info("Usuario findByNameLike: " + user));

  • El patrón "%user%" busca todos los registros cuyo nombre contenga la cadena indicada.
  • Si se cambia a "%J%", el resultado filtra únicamente los nombres que incluyan la letra J.
  • Omitir los porcentajes provoca que no se encuentre ningún resultado.

Este comportamiento replica exactamente un SELECT * FROM users WHERE name LIKE '%valor%' en SQL tradicional.

¿Qué diferencia hay entre LIKE y Containing?

Spring Data ofrece la palabra clave Containing como alternativa a LIKE. La ventaja principal es que no requiere enviar los operadores de porcentaje manualmente [9:28]:

java List<User> findByNameContainingOrderByIdDesc(String name);

Al llamar este método basta con pasar la cadena directamente:

java userRepository.findByNameContainingOrderByIdDesc("user");

El resultado es idéntico: se obtienen todos los usuarios cuyo nombre contenga "user", ordenados de forma descendente por ID.

¿Cómo usar la sentencia OR en query methods?

La sentencia OR permite buscar registros que coincidan con uno u otro criterio. Se define en el repositorio combinando dos campos [3:23]:

java List<User> findByNameOrEmail(String name, String email);

  • Si se envía null como nombre y un email válido como "user10@domain.com", el método encuentra al usuario por su correo electrónico.
  • En sentido contrario, enviando el nombre "user10" y null en el email, localiza al usuario por nombre.

Esta flexibilidad es muy útil cuando se necesita buscar por múltiples criterios opcionales sin escribir consultas condicionales complejas.

¿Cómo filtrar por intervalos de fecha con BETWEEN?

Para consultar registros dentro de un rango de fechas se utiliza la palabra clave Between. En la interfaz se define recibiendo dos parámetros de tipo LocalDate [5:25]:

java List<User> findByBirthdateBetween(LocalDate begin, LocalDate end);

Desde la clase principal se invoca especificando el rango [5:55]:

java userRepository.findByBirthdateBetween( LocalDate.of(2021, 3, 1), LocalDate.of(2021, 4, 2) ) .stream() .forEach(user -> logger.info("Usuario con intervalo de fechas: " + user));

  • El resultado incluye únicamente los usuarios cuya fecha de nacimiento esté dentro del intervalo indicado.
  • En el ejemplo se obtienen dos registros que coinciden con las fechas almacenadas en la base de datos.

¿Cómo ordenar resultados con ORDER BY?

Agregar OrderBy al nombre del query method permite definir el criterio de ordenamiento directamente. La palabra Desc indica orden descendente y Asc orden ascendente [7:18]:

java List<User> findByNameLikeOrderByIdDesc(String name);

Al ejecutar este método con el patrón "%user%", se obtienen todos los usuarios filtrados y ordenados del ID más alto al más bajo:

  • ID 12 aparece primero.
  • ID 4 aparece al final.

Cambiar Desc por Asc invierte el orden sin necesidad de modificar la lógica de negocio.

¿Qué reto puedes practicar con estos query methods?

Una buena forma de afianzar estos conceptos es implementar query methods propios que combinen las sentencias OR, AND y BETWEEN con ordenamientos ascendentes y descendentes. Experimenta recibiendo diferentes parámetros y validando los resultados en el log. Comparte tus dudas o implementaciones en la caja de comentarios.

      Query Methods con OR, BETWEEN y ORDER BY