Contenido del curso

Spring Data Repositories

Qué son los Spring Data Repositories

Resumen

Spring Data Repositories te permite interactuar con la base de datos sin escribir SQL manual, ahorrando tiempo y código al ofrecer operaciones comunes sobre tus entities. Si trabajas con Spring Boot y JPA, dominar estos repositorios te da acceso a métodos predefinidos como findAll, findById o save sin implementar nada.

¿Qué tipos de Spring Data Repositories existen?

Spring ofrece tres repositorios base que cubren la mayoría de casos al trabajar con persistencia. Cada uno aporta funcionalidades distintas según lo que necesites en tu aplicación.

  • CrudRepository: el más popular. Provee operaciones CRUD aplicables a cualquier entidad, como guardar, buscar por id, verificar existencia o eliminar.
  • PagingAndSortingRepository: permite paginar y ordenar los resultados que obtienes desde una entity.
  • JpaRepository: extiende de los dos anteriores y añade operaciones específicas de JPA, como flush.

Tanto CrudRepository como PagingAndSortingRepository tienen versiones hijas: ListCrudRepository y ListPagingAndSortingRepository. La diferencia clave es que en lugar de retornar un Iterable, devuelven un List, lo cual resulta mucho más intuitivo cuando ya estás trabajando con listas en tu lógica de negocio.

¿Cuál es la diferencia entre CrudRepository y ListCrudRepository? El CrudRepository retorna un Iterable en métodos como findAll, mientras que ListCrudRepository retorna directamente una List, lo que facilita iterar y manipular resultados.

¿Cómo activar los repositorios en una aplicación Spring Boot?

Antes de crear cualquier repositorio, debes habilitar la funcionalidad en tu aplicación. El paso es simple pero indispensable.

Ve a la clase principal, la que tiene el método main y la anotación @SpringBootApplication, y agrégale la anotación @EnableJpaRepositories. Con eso le indicas a Spring que vas a trabajar con repositorios JPA.

¿Cómo crear un repositorio personalizado paso a paso?

Dentro del paquete persistent.repository, crea una nueva interfaz. En el ejemplo de la clase, se llama PizzaRepository y se define así:

java public interface PizzaRepository extends ListCrudRepository<PizzaEntity, Integer> { }

Los parámetros del operador diamante son dos: la entity con la que vas a trabajar (PizzaEntity) y el tipo de dato de su clave primaria (Integer, en este caso, porque la primary key de PizzaEntity es entera).

Con esa simple declaración, ya tienes acceso a métodos como findAll, findById, save, existsById y muchos más, sin escribir una sola línea de implementación.

¿Cómo reemplazar JdbcTemplate por un Spring Repository?

En la capa de servicio, el cambio es directo. En lugar de inyectar JdbcTemplate y escribir SQL crudo para recuperar pizzas, inyectas PizzaRepository en el constructor de PizzaService y llamas directamente al método findAll().

java public List<PizzaEntity> getAll() { return this.pizzaRepository.findAll(); }

El controlador no necesita cambios. Al lanzar la aplicación y enviar la petición desde Postman, recuperas todas las pizzas igual que antes, pero sin escribir SQL. Si revisas la consola, verás que Spring tradujo internamente el findAll a un SELECT * FROM pizza. Esa traducción automática es la magia de los repositorios.

¿Cómo buscar un registro por su clave primaria con findById?

Para consultar una sola pizza por su id, agregas un método como este en el servicio:

java public PizzaEntity get(int idPizza) { return this.pizzaRepository.findById(idPizza).orElse(null); }

El método findById retorna un Optional<PizzaEntity>, y aprovechando programación funcional usas orElse(null) para devolver null si no encuentra el registro.

En el controlador, agregas un nuevo @GetMapping que reciba el id como @PathVariable:

java @GetMapping("/{idPizza}") public PizzaEntity get(@PathVariable int idPizza) { return this.pizzaService.get(idPizza); }

Al probar en Postman con /6, recibes solo la información de esa pizza. Si pruebas con un id inexistente como 600, la respuesta llega vacía.

¿Qué hace findById en Spring Data? Busca un registro por su clave primaria y retorna un Optional que envuelve la entidad si existe, o queda vacío si no se encuentra.

¿Por qué usar Spring Data Repositories en tus proyectos?

Los repositorios son un aliado enorme porque eliminan código repetitivo de acceso a datos y te dejan enfocarte en la lógica de negocio. Con apenas una interfaz y la herencia correcta, ya tienes operaciones de CRUD listas, paginación, ordenamiento y traducción automática a SQL.

En el proyecto de la pizzería, el menú completo se sirve ahora desde la base de datos con un par de líneas, sin queries manuales. Y esto es solo el comienzo: más adelante puedes definir métodos derivados, queries personalizadas y operaciones complejas con la misma simplicidad.

¿Ya migraste algún proyecto de JdbcTemplate a Spring Data Repositories? Cuéntame en los comentarios qué método te resultó más útil al hacer el cambio.