как использовать @RequestParam
у меня есть модель Faculty имеющая id name и color сервис, контроллер и репозиторий, мне нужно добавить эндпоинт для поиска факультета по имени или цвету, игнорируя регистр, т. е. в GET-запросе будет передана строка, по которой будет происходить фильтрация. У меня не получается правильно использовать @RequestParam и сдeлать так чтоб, если в ссылке пришел color метод сервиса использовал color, аналогично если пришло name то метод сервиса использовал поиск по имени. То есть если в url передали только цвет, выводились факультеты определегного цвета
факультет:
@Data
@Entity
public class Faculty {
@Id
@GeneratedValue
private Long id;
private String name;
private String color;
метод в сервисе :
@Service
public class FacultyService {
private final FacultyRepository facultyRepository;
public FacultyService(FacultyRepository facultyRepository) {
this.facultyRepository = facultyRepository;
}
...
public Collection<Faculty> findBy(String colorOrName) {
return facultyRepository.findAllByColorIgnoreCaseOrNameIgnoreCase(colorOrName);
}
...
репозиторий факультета:
public interface FacultyRepository extends JpaRepository<Faculty, Long> {
Collection<Faculty> findAllByColorIgnoreCaseOrNameIgnoreCase(String colorOrName);
контроллер факультета:
@RestController
@RequestMapping("faculty")
public class FacultyController {
private final FacultyService facultyService;
public FacultyController(FacultyService facultyService) {
this.facultyService = facultyService;
}
...
@GetMapping("/findBy")
public Collection<Faculty> findBy(@RequestParam String colorOrName) {
return facultyService.findBy(colorOrName);
}
...
Ответы (2 шт):
Скорее всего, здесь проблема не в контроллере, а в имени и количестве параметров метода репозитория, который либо следует корректно переназвать и обеспечить два входных параметра, затем вызывая этот метод предоставив одно и то же значение для обоих параметров:
// репозиторий
public interface FacultyRepository extends JpaRepository<Faculty, Long> {
Collection<Faculty> findByColorIgnoreCaseOrNameIgnoreCase(String color, String name);
}
// сервис
@Service
public class FacultyService {
public Collection<Faculty> findBy(String colorOrName) {
return facultyRepository.findByColorIgnoreCaseOrNameIgnoreCase(colorOrName, colorOrName);
}
}
Или же построить запрос, использующий одно значение для двух полей:
public interface FacultyRepository extends JpaRepository<Faculty, Long> {
@Query(value = "SELECT f FROM Faculty f WHERE lower(name) = lower(:colorOrName) OR lower(color) = lower(:colorOrName)")
Collection<Faculty> getFacultiesWhereColorOrName(@Param("colorOrName") String colorOrName);
}
В репозитории в методе 2 параметра: name и color. В сервисе в соответствующем методе 1 параметр (nameOrColor) и затем в вызове метода репозитория 2 раза указываешь в параметры nameOrColor
Repository:
public interface FacultyRepository extends JpaRepository<Faculty, Long> { Collection<Faculty> findAllByColorIgnoreCaseOrNameIgnoreCase(String name, String color);
Service:
public Collection<Faculty> findAllFacultiesByNameOrColor(String nameOrColor) {return facultyRepository.findAllByColorIgnoreCaseOrNameIgnoreCase(nameOrColor, nameOrColor);}
Controller:
@GetMapping("/findBy")
public Collection<Faculty> findBy(@RequestParam String colorOrName) { return facultyService.findAllFacultiesByNameOrColor(colorOrName);}