fbpx

JpaRepository en SPRING DATA

JpaRepository es una interfaz creada en SPRING DATA para hacernos más fácil la forma de poder administrar los datos en nuestra base de datos. La interfaz JpaRepository acepta dos genéricos como parámetros el primero de ellos representa la clase entidad y el segundo representa el tipo de clase utilizado cómo identificador primario.

Vídeo de explicación

Creando un JpaRepository

Para crear tu primer repositorio gracias a la interfaz JpaRepository primero debes de definir una clase entidad con la anotación @Entity de JPA. Aquí tienes un pequeño ejemplo:

@Entity
public class Usuario {

    @Id
    private Long id;
    private String nombre;

}

Una vez definida nuestra clase entidad, podemos crear nuestra interfaz que extienda de JpaRepository, la cuál utilizará dos genéricos <Usuario, Long> representando <CLASE_ENTIDAD, CLASE_DEL_ID>:

@Repository
public interface UsuarioRepositorio extends JpaRepository<Usuario, Long> {
}

Usando JpaRepository

La interfaz JpaRepository ofrece diferentes métodos implementados pos Spring Data que nos ayuda a manejar nuestros datos de la base de datos que hereda también de la interfaz CrudRepository sin necesidad de tener que implementarlo nosotros mismos. En está sección veremos algunos de ellos.

deleteAllByIdInBatch

Elimina las entidades identificadas por los ids dados utilizando una única consulta.

List<Long> ids = Arrays.asList(1L, 2L, 3L);
usuarioRepositorio.deleteAllByIdInBatch(ids);

deleteAllInBatch

Elimina todas las entidades de una llamada por lotes.

usuarioRepositorio.deleteAllInBatch();

deleteAllInBatch

Elimina las entidades dadas en un lote, lo que significa que creará una única consulta.

List ids = Arrays.asList(usuario1, usuario2, usuario3);
usuarioRepositorio.deleteAllInBatch(ids);

findAll

Encuentra todas las entidades usando la interfaz QueryByExampleExecutor.

Example<Usuario> example = Example.of(usuario);
usuarioRepositorio.findAll(example);

getReferenceById

getReferenceyById acepta cómo parámetro el ID de nuestra entidad que queremos devolver y devuelve la entidad pero a diferencia de findById, la entidad no es obtenida a través de SQL y solamente es obtenida su referencia, esto es útil si quieres insertar un nuevo valor en otra entidad que hace referencia a tu entidad pero no quieres obtener los datos de tu entidad. Ejemplo:

Usando findById

Comentario  = new Comentario()
            .setValor("Genial articulo")
            .setUsuario(usuarioRepositorio.findById(postId)
                .orElseThrow(
                    ()-> new EntityNotFoundException(
                        String.format(
                            "Usuario con id [%d] no encontrado",
                            usuarioId
                        )
                    )
                )
            );
 
comentarioRepositorio.save(comment);

Generaría el siguiente SQL:

SELECT
    usuario0_.id AS id1_0_0_,
    usuario0_.nombre AS nombre_0_0_
FROM
    usuarios usuario0_
WHERE
    usuario0_.id = 1
 
SELECT nextval ('hibernate_sequence')
 
INSERT INTO usuario_comentario (
    comentario_id,
    valor,
    usuario_id
)
VALUES (
    1,
    'Genial Articulo',
    1
)

Usando getReferenceById

Comentario comentario = new Comentario()
        .setValor("Genial articulo")
        .setPost(usuarioRepository.getReferenceById(usuarioId));
 
comentarioRepositorio.save(comentario);

Genera el siguiente SQL:

SELECT nextval ('hibernate_sequence')
 
INSERT INTO usuario_comentario (
    comentario_id,
    valor,
    usuario_id
)
VALUES (
    1,
    'Genial Articulo',
    1
)

saveAllAndFlush

Guarda todas las entidades y descarga los cambios al instante. Normalmente, utilizamos este método cuando nuestra lógica de negocio necesita leer los cambios guardados en un punto posterior durante la misma transacción, pero antes del commit.

List ids = Arrays.asList(usuario1, usuario2, usuario3);
usuarioRepositorio.saveAllAndFlush(ids);

saveAndFlush

Guarda todas la entidad y descarga los cambios al instante. Normalmente, utilizamos este método cuando nuestra lógica de negocio necesita leer los cambios guardados en un punto posterior durante la misma transacción, pero antes del commit.

usuarioRepositorio.saveAndFlush(usuario);