Saltar al contenido

El método JPA findBy siempre va a orElseThrow

Buscamos por diferentes espacios y así brindarte la respuesta a tu duda, en caso de dificultades déjanos la pregunta y te contestaremos con mucho gusto, porque estamos para ayudarte.

Solución:

return specRepo.findByIdentificationType(idType)
            .orElse(specRepo.findById(idType)
                .orElseThrow(() -> new ResourceNotFoundException("...")));

Es la razón.

Java es bastante entusiasta en la ejecución y siempre llama al método orElse para prepararse en caso de que lo necesite.

El orden de su ejecución es de alguna manera:

  1. specRepo.findByIdentificationType(idType)
  2. orElse no se puede ejecutar porque su argumento aún no se ha evaluado
  3. specRepo.findById(idType)
  4. .orElseThrow(() -> new ResourceNotFoundException("..."))
  5. El resultado de 3 y 4 se convierte en un objeto. o
  6. orElse(o)

En lugar de usar orElse uno debe preferir orElseGet.

return specRepo.findByIdentificationType(idType)
            .orElseGet(() -> specRepo.findById(idType)
                .orElseThrow(() -> new ResourceNotFoundException("...")));

Sólo se llamará cuando sea necesario.

Aquí tenemos dos escenarios:

  1. specRepo devuelve un Opcional no vacío.
  2. specRepo devuelve un objeto vacío.

En el escenario 1, idType es un valido identificationType por lo tanto no es un identonces el findById lanzará una excepción. En el escenario 2, idType no es valido identificationType y si es legal id el método debería resultar en el lanzamiento de una excepción.

Editar:

Si bien esta responde diagnostica el problema y describe cuál es la razón de tal comportamiento, @Abinash Ghosh answer proporciona la solución más simple e imo mejor del problema.

En general, evite usar orElse. En este caso, agregue el findByIdentificationTypeOrId(String it, String id) a su repositorio.

@xenteros tiene razón, ese es el problema. Puedes usar findByIdentificationTypeOrId para obtener datos en una consulta

return specRepo.findByIdentifcationTypeOrId(idType, idType)
                .orElseThrow(() -> new ResourceNotFoundException("...")));

y repositorio como

@Repository
public interface IdentificationSpecRepository extends CrudRepository

    Optional findByIdentificationTypeOrId(String identificationType, String id);

Si piensas que ha resultado de ayuda nuestro post, nos gustaría que lo compartas con más juniors de esta manera contrubuyes a extender nuestro contenido.

¡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 *