tutorial responsebody que mvc mediante framework español ejemplo desarrollo basico aplicaciones anotaciones spring hibernate spring-data spring-data-jpa jpql

spring - responsebody - Parámetro opcional de datos de primavera en el método de consulta



spring mvc (4)

Quiero escribir algunos métodos de consulta en la capa de repositorio. Este método debe ignorar los parámetros nulos. Por ejemplo:

List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);

Este método debe ser devuelto Foo por esta condición:

bar == barParam && goo == gooParam;

Si gooParam no es nulo. Si gooParam era nulo, la condición cambia a:

bar == barParam;

¿Hay alguna solución? ¿Alguien me puede ayudar?


Complementando la respuesta de @chaserb, personalmente agregaría el parámetro como un tipo opcional de Java8 para hacerlo explícito en la firma del método, la semántica, que es un filtro opcional.

@Query("select foo from Foo foo where foo.bar = :bar and " + "(:goo is null or foo.goo = :goo)") public List<Foo> findByBarAndOptionalGoo( @Param("bar") Bar bar, @Param("goo") Optional<Goo> goo);


Demasiado tarde para responder. No estoy seguro acerca de la relación entre Bar y Goo . Compruebe si el Ejemplo puede ayudarle.

Funciono para mi Tengo una situación similar, el usuario de la entidad tiene un conjunto de atributos y hay un método findAll que busca usuarios según los atributos (que son opcionales).

Ejemplo,

Class User{ String firstName; String lastName; String id; } Class UserService{ // All are optional List<User> findBy(String firstName, String lastName, String id){ User u = new User(); u.setFirstName(firstName); u.setLastName(lastName); u.setId(id); userRepository.findAll(Example.of(user)); // userRepository is a JpaRepository class } }


No creo que pueda hacerlo con el enfoque del nombre del método para la definición de la consulta. De la documentación ( reference ):

Aunque obtener una consulta derivada del nombre del método es bastante conveniente, uno podría enfrentar la situación en la que el analizador del nombre del método no admite la palabra clave que se quiere usar o el nombre del método se volvería innecesariamente feo. Por lo tanto, puede utilizar las consultas con nombre JPA a través de una convención de nomenclatura (consulte Usar QPA NamedQueries para obtener más información) o anote su método de consulta con @Query

Creo que tiene esa situación aquí, por lo que la respuesta a continuación utiliza el enfoque de anotación @Query, que es casi tan conveniente como el enfoque de nombre de método ( reference ).

@Query("select foo from Foo foo where foo.bar = :bar and " + "(:goo is null or foo.goo = :goo)") public List<Foo> findByBarAndOptionalGoo( @Param("bar") Bar bar, @Param("goo") Goo goo);


Puede codificar esto usted mismo en unas pocas líneas:

List<Foo> findByBarAndOptionalGoo(Bar bar, Goo goo) { return (goo == null) ? this.findByBar(bar) : this.findByBarAndGoo(bar, goo); }

De lo contrario, no sé si Spring-Data admite esto de forma inmediata.