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);