Saltar al contenido

Diferencia entre findBy y findOneBy en Spring data JPA

Tenemos la mejor solución que hemos encontrado en internet. Nosotros esperamos que te resulte de utilidad y si quieres aportar alguna mejora hazlo con total libertad.

Solución:

Puedo usar findBy ¿Por aquí? Departamento findByDepartmentId(Long Id);

Sí, esta sintaxis es técnicamente correcta desde el punto de vista de Spring JPA. Aunque Spring JPA infiere lo que está tratando de lograr con su consulta mirando el tipo de devolución también.

Básicamente estos son los casos para los tipos de devolución:

  • con su consulta desea devolver un valor único; puede especificar basic type, Entity T, Optional, CompletableFuture etc

  • con su consulta desea devolver una colección de T; puede especificar List, Stream, Page, Slice etc

Dicho esto, su definición de consulta:

Department findByDepartmentId(Long Id);

significa que espera un único resultado (porque ha especificado Entity T como tipo de devolución). Esto reflejará cómo Spring JPA ejecuta la consulta: llamará getSingleResult() sobre el javax.persistence.Query interfaz, que lanzará un exception si más de un objeto satisface los criterios.

¿Sobre qué base findBydepartmentId devolver un solo registro?

Sobre la base de que hay un solo objeto con esa identificación, de lo contrario, generará una excepción.

¿Cuándo o por qué no debo usar findBy en lugar de findOneBy?

Esos dos tienen significados diferentes y no son intercambiables.

findOneBy siempre da como resultado getSingleResult() siendo invocado.

findBy tiene un comportamiento diferente según el tipo de devolución, según las definiciones dadas anteriormente.

findOneByXX se asegurará de que solo haya uno o ningún valor, si hay 2 valores, se lanzará una excepción.

Sin embargo findByXX no realiza esta comprobación de unicidad.

Hice algunas pruebas y Spring Data ignora todos los caracteres entre el método (find, delete,…) y By.

En https://github.com/spring-projects/spring-data-commons/blob/14d5747f68737bb44441dc511cf16393d9d85dc8/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L65 es el pLu.*? parte.

Spring Data solo usa el tipo de devolución para decidir cómo manejar las respuestas.

Por lo tanto, es posible definir estos métodos siguientes incluso si no es correcto semánticamente.

Department findAllByDepartmentId(Long Id);
List findOneByDepartmentName(String name);

Aquí puedes ver las comentarios y valoraciones de los lectores

Si para ti ha sido útil nuestro artículo, nos gustaría que lo compartas con más entusiastas de la programación y nos ayudes a dar difusión a nuestra información.

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