I work with Spring Data and Neo4j in my current project and have the following situation:
@RestController
@RequestMapping(value = SearchResource.URI)
public class PersonResource {
public static final String URI = "/person";
@Autowired
PersonRepository personRepository;
@GetMapping
public Collection<Person> findPersons(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "birthDate", required = false) Long birthDate,
@RequestParam(value = "town", required = false) Spring town) {
Collection<Person> persons;
if (name != null && birthDate == null && town == null) {
persons = personRepository.findPersonByName(name);
} else if (name != null && birthDate != null && town == null {
persons = personRepository.findPersonByNameAndBirthDate(name, birthDate);
} else if (name != null && birthDate != null && town != null {
persons = personRepository.findPersonByNameAndBirthDateAndTown(name, birthDate, town);
} else if (name == null && birthDate != null && town == null {
persons = findPersonByBirthDate(birthDate);
} else if
...
}
return persons;
}
}
You probably already can see my problem: the chain of if-else-blocks. Each time I add a new filter for searching for persons, I have to add new optional parameter, double all the if-else-blocks and add new find-Methods to my PersonRepository. All the find-Methods are annotated with Spring @Query annotation and get a custom cypher query to get the data.
Is it possible to implement this functionality in a more elegant way? Does Spring Data offer any support in such situation?