как использовать @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 шт):

Автор решения: Nowhere Man

Скорее всего, здесь проблема не в контроллере, а в имени и количестве параметров метода репозитория, который либо следует корректно переназвать и обеспечить два входных параметра, затем вызывая этот метод предоставив одно и то же значение для обоих параметров:

// репозиторий
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);
}
→ Ссылка
Автор решения: GTBuntilIdie

В репозитории в методе 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);}
→ Ссылка