Spring Boot

SpringBoot

Tutorial SpringBoot: Repositorios Spring Data

Spring Boot repositorios CRUD: manejo y ejemplos. Domina la creación y gestión de repositorios CRUD en Spring Boot con ejemplos prácticos y detallados.

Uno de los aspectos más interesantes de Spring Boot es su integración con Spring Data, una suite de librerías que proporciona un framework consistente y fácil de usar para el acceso a datos y operaciones de persistencia con bases de datos.

Dentro de Spring Data existen multitud de proyectos como Spring Data JPA, Spring Data MongoDB, Spring Data Redis, etc.

Estos proyectos proporcionan interfaces de las que extender nuestras propias interfaces, lo que nos permite heredar métodos con funcionalidades CRUD (Create, Read, Update, Delete).

CrudRepository

CrudRepository es una interfaz proporcionada por Spring Data que proporciona métodos genéricos para operaciones CRUD (Create, Read, Update, Delete) en una entidad de dominio.

Al extender CrudRepository, el desarrollador obtiene varios métodos listos para usar sin necesidad de implementarlos manualmente. Algunos de estos métodos son:

  • save(S entity): Guarda la entidad dada. Si la entidad ya existe, la actualiza.
  • findById(ID id): Retorna una entidad por su ID.
  • existsById(ID id): Verifica si una entidad existe por su ID.
  • findAll(): Retorna todas las entidades.
  • deleteById(ID id): Borra la entidad por su ID.
  • deleteAll(): Borra todas las entidades.

Por ejemplo, si se tiene una entidad User, se puede crear un repositorio UserRepository de la siguiente manera:

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {

}

Una vez que se ha creado este repositorio, se puede inyectar en cualquier clase y usarlo para realizar operaciones CRUD en la entidad User.

JpaRepository

JpaRepository es otra interfaz proporcionada por Spring Data que extiende CrudRepository y PagingAndSortingRepository (que proporciona métodos para paginar y ordenar registros). Por lo tanto, JpaRepository hereda todos los métodos de estas dos interfaces.

JpaRepository también proporciona algunas funcionalidades adicionales específicas de JPA, como:

  • flush(): Aplica todas las operaciones pendientes a la base de datos.
  • deleteAllInBatch(Iterable<T> entities): Borra las entidades en un lote, lo que es más eficiente que borrar una por una.
  • <S extends T> List<S> findAll(Example<S> example): Soporte para consultas de ejemplo con la API Query By Example.

Aquí hay un ejemplo de cómo se puede crear un repositorio UserRepository que extiende JpaRepository:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

}

De igual manera que con CrudRepository, una vez que se ha creado este repositorio, se puede inyectar en cualquier clase y usarlo para realizar operaciones CRUD, además de las operaciones adicionales proporcionadas por JpaRepository, en la entidad User.

Es importante mencionar que, si bien JpaRepository proporciona más funcionalidad que CrudRepository, no todas las aplicaciones necesitarán esta funcionalidad adicional. Por lo tanto, el desarrollador debe considerar cuidadosamente qué interfaz es la más adecuada para sus necesidades específicas.

Operaciones derivadas del nombre del método

Spring Data JPA tiene una característica poderosa que permite crear consultas simplemente definiendo una interfaz de método en el repositorio. Este enfoque es mejor conocido como "operaciones derivadas del nombre del método".

En este sistema, el nombre de los métodos de la interfaz del repositorio sigue una convención que Spring Data interpreta y traduce en la consulta SQL correspondiente. Por ejemplo, si tu entidad tiene un campo llamado email y quieres buscar una entidad basándote en ese campo, puedes añadir el método findByEmail(String email) a tu repositorio. No necesitas proporcionar ninguna implementación para este método. En tiempo de ejecución, Spring Data generará una implementación adecuada.

Aquí hay un ejemplo con una entidad User y un repositorio UserRepository:

import org.springframework.data.repository.CrudRepository;
import java.util.List;

public interface UserRepository extends CrudRepository<User, Long> {
    List<User> findByEmail(String email);
}

Cuando este código se ejecuta, Spring Data JPA creará una implementación del método findByEmail que ejecuta una consulta SQL similar a SELECT * FROM user WHERE email = ?.

La convención de nomenclatura soporta varias palabras clave que pueden ayudar a construir consultas más complejas, como And, Or, Between, LessThan, GreaterThan, Like, OrderBy, y muchas más. Por ejemplo:

import org.springframework.data.repository.CrudRepository;
import java.util.List;

public interface UserRepository extends CrudRepository<User, Long> {
    List<User> findByEmailAndFirstName(String email, String firstName);
    List<User> findByAgeBetween(int startAge, int endAge);
    List<User> findByLastNameLike(String lastName);
    List<User> findByAgeGreaterThan(int age);
    List<User> findByFirstNameOrderByLastNameAsc(String firstName);
}

Estos métodos se traducirán en las siguientes consultas SQL:

  1. SELECT * FROM user WHERE email = ? AND firstName = ?
  2. SELECT * FROM user WHERE age BETWEEN ? AND ?
  3. SELECT * FROM user WHERE lastName LIKE ?
  4. SELECT * FROM user WHERE age > ?
  5. SELECT * FROM user WHERE firstName = ? ORDER BY lastName ASC

Es importante recordar que, aunque las operaciones derivadas del nombre del método pueden simplificar la implementación de las operaciones de consulta comunes, también pueden llevar a nombres de métodos largos y difíciles de leer para consultas más complejas. En tales casos, puede ser preferible utilizar la anotación @Query para definir la consulta directamente.

Consultas personalizadas

Si bien las operaciones derivadas del nombre del método son poderosas y cubren una gran cantidad de casos de uso comunes, hay momentos en que se necesita un mayor control sobre la consulta de la base de datos. Para estos casos, Spring Data JPA proporciona una forma de especificar consultas personalizadas a través de la anotación @Query.

La anotación @Query se puede utilizar para especificar una consulta JPQL (Java Persistence Query Language) que será ejecutada. La consulta puede hacer referencia a los parámetros del método utilizando un índice basado en 1 precedido por un signo de interrogación.

Por ejemplo, si se quiere buscar usuarios por su apellido, pero solo se quiere retornar aquellos usuarios que tengan un correo electrónico que termine con un cierto dominio, se podría utilizar la anotación @Query para definir esta consulta personalizada en la interfaz del repositorio:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.lastName = ?1 AND u.email LIKE %?2")
    List<User> findByLastNameAndEmailDomain(String lastName, String emailDomain);
}

En este caso, ?1 se refiere al primer parámetro del método (lastName) y %?2 se refiere al segundo parámetro (emailDomain), con un símbolo de porcentaje (%) añadido para la operación LIKE.

La anotación @Query también puede ser utilizada para ejecutar consultas nativas SQL, simplemente pasando el atributo nativeQuery = true a la anotación. Por ejemplo:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT * FROM Users u WHERE u.last_name = ?1 AND u.email LIKE %?2", nativeQuery = true)
    List<User> findByLastNameAndEmailDomain(String lastName, String emailDomain);
}

Aquí se está ejecutando una consulta SQL nativa en lugar de una consulta JPQL. Por favor, ten en cuenta que las consultas nativas son específicas de la base de datos y no son portables entre diferentes tipos de bases de datos.

Las consultas personalizadas proporcionan un gran nivel de control sobre las operaciones de la base de datos y permiten al desarrollador escribir consultas complejas que no pueden ser fácilmente expresadas a través de las operaciones derivadas del nombre del método.

Conclusión

Los repositorios de Spring Data representan una poderosa abstracción que simplifica el desarrollo de capas de persistencia en aplicaciones Spring Boot. Permiten a los desarrolladores centrarse en la lógica de negocio de su aplicación, evitando el código repetitivo y reduciendo la posibilidad de errores en la manipulación de datos.

Las interfaces CrudRepository y JpaRepository proporcionan una amplia gama de métodos para realizar operaciones de la base de datos sin necesidad de implementarlos. Estos repositorios pueden adaptarse a casi cualquier requisito, ya que ofrecen una manera de realizar operaciones básicas de CRUD, así como paginación y ordenación.

Además, los repositorios de Spring Data tienen la característica única de permitir la creación de consultas simplemente definiendo métodos en la interfaz del repositorio, una funcionalidad conocida como "operaciones derivadas del nombre del método". Esta característica puede simplificar enormemente el proceso de escritura de consultas para casos comunes.

Sin embargo, para casos más complejos que requieran consultas personalizadas, Spring Data JPA ofrece la anotación @Query. Esta anotación permite a los desarrolladores escribir consultas personalizadas utilizando JPQL o incluso SQL nativo, proporcionando un gran nivel de flexibilidad y control.

En general, los repositorios de Spring Data aportan una gran productividad y eficiencia al proceso de desarrollo, ya que minimizan la cantidad de código que se necesita escribir y mantienen la base de código más limpia y fácil de mantener. Independientemente de las necesidades específicas de la aplicación, es probable que los repositorios de Spring Data puedan adaptarse y proporcionar una solución efectiva y eficiente para la persistencia de datos.

Certifícate en SpringBoot con CertiDevs PLUS

Ejercicios de esta lección Repositorios Spring Data

Evalúa tus conocimientos de esta lección Repositorios Spring Data con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Web y Test Starters

Spring Boot
Puzzle

Entidades JPA

Spring Boot
Test

Repositorios reactivos

Spring Boot
Test

Inserción de datos

Spring Boot
Test

Borrar datos de base de datos

Spring Boot
Test

Controladores Spring MVC

Spring Boot
Código

Backend API REST con Spring Boot

Spring Boot
Proyecto

Operadores Reactivos

Spring Boot
Puzzle

Controladores Spring REST

Spring Boot
Código

Uso de Spring con Thymeleaf

Spring Boot
Puzzle

Crear entidades JPA

Spring Boot
Código

Registro de usuarios

Spring Boot
Test

CRUD y JPA Repository

Spring Boot
Puzzle

Anotaciones y mapeo en JPA

Spring Boot
Puzzle

Integración con Vue

Spring Boot
Test

Consultas JPQL con @Query en Spring Data JPA

Spring Boot
Test

Open API y cómo agregarlo en Spring Boot

Spring Boot
Puzzle

Uso de Controladores REST

Spring Boot
Puzzle

API Specification

Spring Boot
Puzzle

Inyección de dependencias

Spring Boot
Test

Introducción a Spring Boot

Spring Boot
Test

Consultas JPQL con @Query en Spring Data JPA

Spring Boot
Puzzle

API Query By Example (QBE)

Spring Boot
Puzzle

Inyección de dependencias

Spring Boot
Código

Vista en Spring MVC con Thymeleaf

Spring Boot
Test

Servicios en Spring

Spring Boot
Código

Configuración de Vue

Spring Boot
Puzzle

Integración con Angular

Spring Boot
Test

API Query By Example (QBE)

Spring Boot
Test

API Specification

Spring Boot
Test

Controladores MVC

Spring Boot
Test

Métodos find en repositorios

Spring Boot
Test

Repositorios Spring Data

Spring Boot
Test

Inyección de dependencias

Spring Boot
Puzzle

Data JPA y Mail Starters

Spring Boot
Test

Configuración de Angular

Spring Boot
Puzzle

Controladores Spring REST

Spring Boot
Test

Configuración de Controladores MVC

Spring Boot
Puzzle

Asociaciones de entidades JPA

Spring Boot
Código

Actualizar datos de base de datos

Spring Boot
Test

Identificadores y relaciones JPA

Spring Boot
Puzzle

Verificar token JWT en peticiones

Spring Boot
Test

Login de usuarios

Spring Boot
Test

Integración con React

Spring Boot
Test

Configuración de React

Spring Boot
Puzzle

Asociaciones en JPA

Spring Boot
Test

Consultas JPQL

Spring Boot
Código

Todas las lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Web

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Web

Controladores Spring Rest

Spring Boot

Spring Web

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Web

Servicios En Spring

Spring Boot

Spring Web

Crear Entidades Jpa

Spring Boot

Persistencia Con Spring Data

Asociaciones De Entidades Jpa

Spring Boot

Persistencia Con Spring Data

Repositorios Spring Data

Spring Boot

Persistencia Con Spring Data

Métodos Find En Repositorios

Spring Boot

Persistencia Con Spring Data

Inserción De Datos

Spring Boot

Persistencia Con Spring Data

Actualizar Datos De Base De Datos

Spring Boot

Persistencia Con Spring Data

Borrar Datos De Base De Datos

Spring Boot

Persistencia Con Spring Data

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Persistencia Con Spring Data

Api Query By Example (Qbe)

Spring Boot

Persistencia Con Spring Data

Repositorios Reactivos

Spring Boot

Persistencia Con Spring Data

Api Specification

Spring Boot

Persistencia Con Spring Data

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Integración Con Angular

Spring Boot

Integración Frontend

Registro De Usuarios

Spring Boot

Seguridad Con Spring Security

Login De Usuarios

Spring Boot

Seguridad Con Spring Security

Verificar Token Jwt En Peticiones

Spring Boot

Seguridad Con Spring Security

En esta lección

Objetivos de aprendizaje de esta lección

  1. Entender y utilizar las interfaces CrudRepository y JpaRepository: Estas interfaces proporcionan operaciones CRUD listas para usar en cualquier entidad, así como capacidades adicionales como paginación y ordenación.
  2. Crear consultas utilizando operaciones derivadas del nombre del método: Spring Data puede inferir consultas de la base de datos basándose en la convención de nombres de los métodos en la interfaz del repositorio.
  3. Definir consultas personalizadas utilizando la anotación @Query: Para consultas más complejas, Spring Data permite la definición de consultas personalizadas usando JPQL o SQL nativo.
  4. Aplicar correctamente la elección del repositorio según el caso de uso: Distinguir cuándo usar CrudRepository, JpaRepository o consultas personalizadas, dependiendo de las necesidades específicas del proyecto.