Contenido del curso
Primeros pasos
Spring Data Repositories
- 7

Uso de Spring Data Repositories para Gestión de Datos
08:39 min - 8

Guardar y Actualizar Registros con Spring Data Repositories
08:34 min - 9

Eliminar elementos con Spring Data JPA: método deleteById
05:36 min - 10

Lazy vs Eager en relaciones JPA
15:09 min - 11

Query Methods en Spring para Consultas Personalizadas
08:27 min - 12

Filtrar pizzas con Containing y Not en JPA
Viendo ahora - 13

Consultas Avanzadas con Query Methods en Java Spring
11:25 min - 14

Uso de Query Methods para Filtrar y Ordenar Datos en Spring
09:30 min - 15

Paginación y Ordenación con Spring Data Repositories
07:38 min - 16

Ordenamiento Dinámico con Paging and Sorting Repository
07:58 min
Personalización de queries
- 17

Consultas de Base de Datos con JPQL en Spring Boot
08:01 min - 18

Consultas SQL nativas y ordenación con Hibernate en Spring Data
08:26 min - 19

Projections con JPA para queries de varias tablas
13:45 min - 20

Actualización de Precios de Pizza con Spring Data JPA
11:50 min - 21

Propiedades ACID y Spring Data: Uso de @Transactional
10:06 min
Características avanzadas
Próximos pasos
Filtrar pizzas con Containing y Not en JPA
Resumen
Filtrar registros por contenido de texto es una de las tareas más comunes cuando construyes una API con Spring Data JPA. Con los query methods y los keywords Containing y Not puedes recuperar datos sin escribir una sola línea de SQL, y aquí te muestro cómo hacerlo con una tabla de pizzas y sus ingredientes.
¿Cómo filtrar registros que contengan un texto con Containing?
La idea es buscar dentro de la columna description de la tabla pizza para devolver solo aquellas que incluyan un ingrediente específico. Para eso, en el repositorio defines un método que retorne una lista de PizzaEntity siguiendo la convención de Spring Data.
¿Por qué usar findBy en vez de queryBy o searchAllBy?
Spring Data JPA acepta varios prefijos equivalentes: findBy, getAllBy, queryBy o searchAllBy. Todos funcionan igual, pero la convención más usada es findBy, así que es la opción recomendada para mantener tu código legible y alineado con el estándar de la comunidad.
El método queda así:
java List<PizzaEntity> findByAvailableTrueAndDescriptionContainingIgnoreCase(String description);
Aquí combinas dos condiciones: que la pizza esté disponible (AvailableTrue) y que su descripción contenga el texto recibido como parámetro. El sufijo ContainingIgnoreCase es clave porque ignora si escribes mozzarella, MOZZARELLA o Mozzarella.
¿Qué hace ContainingIgnoreCase en Spring Data JPA? Genera una consulta SQL con
LIKEque busca coincidencias parciales sin distinguir entre mayúsculas y minúsculas, usando internamente la funciónUPPERsobre la columna y el parámetro.
¿Cómo conectar el repositorio con el servicio y el controlador?
En la capa de servicio expones un método público que delega al repositorio:
java public List<PizzaEntity> getWith(String ingredient) { return this.pizzaRepository .findByAvailableTrueAndDescriptionContainingIgnoreCase(ingredient); }
Luego en el PizzaController defines un endpoint que reciba el ingrediente como PathVariable:
java @GetMapping("/with/{ingredient}") public List<PizzaEntity> getWith(@PathVariable String ingredient) { return this.pizzaService.getWith(ingredient); }
Al probar en Postman con GET /with/mozzarella, la respuesta incluye todas las pizzas con mozzarella en su descripción: pepperoni, goat cheese, meat lovers y cualquier otra que tenga ese ingrediente.
¿Cómo excluir registros con el keyword Not?
Y aquí viene lo interesante: invertir la lógica es tan simple como agregar la palabra Not antes de Containing. El método cambia totalmente su comportamiento sin que toques una sola línea de SQL.
java List<PizzaEntity> findByAvailableTrueAndDescriptionNotContainingIgnoreCase(String description);
Esto te devuelve las pizzas disponibles cuya descripción no contenga el ingrediente que mandes. El servicio se llama getWithout y el endpoint queda como /without/{ingredient}.
¿Cómo traduce Spring Data el keyword Not a SQL? Lo convierte en una cláusula
NOT LIKEconUPPERaplicado a la columna y al parámetro, ajustando el dialecto según la base de datos que estés usando.
Al consultar GET /without/mozzarella aparecen pizzas como margarita, margarita vegana o avocado festival, justo las que no incluyen ese ingrediente.
¿Qué SQL genera Spring Data por debajo?
La consulta resultante luce así:
sql SELECT * FROM pizzas WHERE available = true AND UPPER(description) NOT LIKE UPPER(?) ESCAPE '?';
Spring Data se encarga de traducir tu query method al dialecto específico de tu motor de base de datos, así que el mismo código funciona en MySQL, PostgreSQL u otros sin que tengas que modificarlo.
¿Qué keywords de query methods conviene dominar?
Estos son los elementos esenciales que viste en acción:
findBycomo prefijo estándar para iniciar un query method.AvailableTruepara filtrar por un campo booleano sin pasar parámetros.ContainingoContainspara búsquedas tipoLIKE %valor%.IgnoreCasepara ignorar mayúsculas y minúsculas en la comparación.Notcomo modificador que invierte cualquier condición.
Combinar estos keywords te da un poder enorme para construir consultas expresivas sin escribir SQL manualmente. Y esto es solo el inicio: en la siguiente clase verás keywords útiles para trabajar con listas y fechas. ¿Qué otro filtro te gustaría resolver con query methods? Cuéntamelo en los comentarios.