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.