Saltar al contenido

Spring Data JPA findOne () cambia a Opcional, ¿cómo usar esto?

Intenta comprender el código bien antes de usarlo a tu trabajo si ttienes algo que aportar puedes dejarlo en la sección de comentarios.

Solución:

De por lo menos, el 2.0 versión, Spring-Data-Jpa modificado findOne().
Ahora, findOne() no tiene ni la misma firma ni el mismo comportamiento.
Anteriormente, se definió en el CrudRepository interfaz como:

T findOne(ID primaryKey);

Ahora, el sencillo findOne() método que encontrarás en CrudRepository es el definido en el QueryByExampleExecutor interfaz como:

 Optional findOne(Example example);

Eso es implementado finalmente por SimpleJpaRepositoryla implementación por defecto del CrudRepository interfaz.
Este método es una consulta por búsqueda de ejemplo y no desea eso como reemplazo.

De hecho, el método con el mismo comportamiento todavía está en la nueva API, pero el nombre del método ha cambiado.
Se renombró de findOne() para findById() en el CrudRepository interfaz :

Optional findById(ID id); 

Ahora devuelve un Optionalque no es tan malo para prevenir NullPointerException.

Entonces, el método real para invocar ahora es Optional findById(ID id).

¿Cómo usar eso?
Aprendiendo Optional uso. Aquí hay información importante sobre su especificación:

Un objeto contenedor que puede contener o no un objeto nonull valor. Si hay un valor presente, isPresent() devolverá true y get() devolverá el valor.

Se proporcionan métodos adicionales que dependen de la presencia o ausencia de un valor contenido, como orElse() (devuelve un valor predeterminado si el valor no está presente) e ifPresent() (ejecuta un bloque de código si el valor está presente).


Algunos consejos sobre cómo usar Optional con Optional findById(ID id).

Generalmente, cuando busca una entidad por id, desea devolverla o realizar un procesamiento particular si no se recupera.

Aquí hay tres ejemplos de uso clásico.

  1. Suponga que si se encuentra la entidad, desea obtenerla; de lo contrario, desea obtener un valor predeterminado.

Podrías escribir:

Foo foo = repository.findById(id)
                    .orElse(new Foo());

o conseguir un null valor predeterminado si tiene sentido (mismo comportamiento que antes del cambio de API):

Foo foo = repository.findById(id)
                    .orElse(null);
  1. Suponga que si se encuentra la entidad, desea devolverla; de lo contrario, desea generar una excepción.

Podrías escribir:

return repository.findById(id)
        .orElseThrow(() -> new EntityNotFoundException(id));
  1. Supongamos que desea aplicar un procesamiento diferente según se encuentre o no la entidad (sin arrojar necesariamente una excepción).

Podrías escribir:

Optional fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()) 
    Foo foo = fooOptional.get();
    // processing with foo ...
 else 
    // alternative processing....

El método ha sido renombrado a findById(…) devolver un Optional para que tengas que manejar la ausencia tú mismo:

Optional result = repository.findById(…);

result.ifPresent(it -> …); // do something with the value if present
result.map(it -> …); // map the value if present
Foo foo = result.orElse(null); // if you want to continue just like before

De hecho, en la última versión de Spring Data, findOne devuelve un opcional. Si desea recuperar el objeto del Opcional, simplemente puede usar get() en el Opcional. Sin embargo, en primer lugar, un repositorio debe devolver el opcional a un servicio, que luego maneja el caso en el que el opcional está vacío. luego, el servicio debe devolver el objeto al controlador.

Recuerda que te brindamos la opción de añadir un diagnóstico justo si tropezaste tu traba en el momento oportuno.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología