mvc - spring-boot-starter-web
Datos de primavera: ignorar el parámetro si tiene un valor nulo (5)
Actualmente esto no es posible en Spring-data-jpa
.
Hay un ticket JIRA
sobre esto que aún está siendo investigado por el equipo de Spring
.
Sin embargo, si desea una solución alternativa, puede consultar un ejemplo de consulta de criterios simple .
Quiero tener una interfaz de repositorio de datos de primavera que toma dos parámetros. ¿Hay alguna manera de hacer que tenga el siguiente comportamiento?
MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);
Si ambos parámetros tienen un valor, me gustaría que se comporte normalmente y haga un "AND" para ambos valores.
Si, por ejemplo, el segundo parámetro es nulo, solo buscaría por ParameterOne
¿Alguna sugerencia?
No estoy seguro de que sea posible con los nombres de los métodos del repositorio, pero puede usar @Query
como
(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo)
No estoy seguro de si es posible usar Repo como una clase separada, pero puede usar la consulta de anexos StringBuilder con el parámetro de opción. Esto definitivamente funcionará
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("select p.name from personDemographic p ");
Boolean flag = true;
if(parameterOne != null){
if(flag){
queryBuilder.append("where condition...");
flag=false;
}
}
if(parameterOne != null){
if(flag){
queryBuilder.append("where condition...");
flag = false;
}else{
queryBuilder.append("and condition...");
}
Query query = entityManager.createQuery(queryBuilder.toString());
Soy nuevo en el espacio Primavera / JPA,
usar ''consulta por ejemplo''
Estoy usando (en seviceImp), todos los argumentos a continuación son opcionales / dependen de la elección del usuario
`
.
if (!firstName.isEmpty() ) {
staff.setFirstName(firstName);
}
if (!lastName.isEmpty() ) {
staff.setLastName(lastName);
}
if (!ptAadhar.isEmpty() ) {
patient.setPtAadhar(ptAadhar);
}
if (!Cell.isEmpty() ) {
staff.setCell(Cell);
}
Example<StaffEntity> example = Example.of(staff);
List<StaffEntity> staffList =staffRepository.findAll(example);
.
Una solución que falta aquí es la función Consulta por ejemplo de Spring Data JPA y aprovecha el ExampleMatcher#ignoreNullValues
, que se construye exactamente para resolver este problema. Una consulta personalizada y un generador de consultas no son necesarios.
Esta consulta de datos de primavera:
ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", null), matcher);
List<MyObject> results = repository.findAll(exampleQuery);
Produce una consulta que se parece a:
select *
from myObject
where parameter1 = "foo"
Mientras que las siguientes:
ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", "bar"), matcher);
List<MyObject> results = repository.findAll(exampleQuery);
Rendimientos:
select *
from myObject
where parameter1 = "foo"
and parameter2 = "bar"
¡Muy genial!
Nota : una cosa que tendrá que hacer con la interfaz del Repository
es agregar la interfaz QueryByExample
. Puede hacer esto extendiendo la interfaz QueryByExample
directamente o implícitamente a través de JpaRepository
:
public interface MyObjectRepository extends JpaRepository<MyObject, Long> {}