Фильтрация данных в таблице - как правильно организовать

Изучаю связку Spring+Hibernate Имеется сущность:

public class PersonEntity {
    private Long id;
    private String name;
    private Integer age;
    private City city;
    private Countrycountry;
...
}

Мне необходимо выполнить фильтрацию. данных в этой таблице, для отображения в окне браузера. Я думал сделать реализацию в сервисе следующих методов:

.findByName(name);
.findByNameAndAge(name, age);
.findByNameAndAge(name, age, city);
.findByNameAndAge(name, city);
...

Но че-то получается, слишком дофига вариантов методов. Как сделать одни универсальный метод, т.е. что-то типа коллекции в которую можно добавить сколько нужно параметров. Начал читать по этому вопросу и совсем запутался. Где-то пишут про @Filter, где-то про Hibernate Search, есть еще Spring Data Elasticsearch. Подскажите самый простой и актуальный способ реализации этого. Если есть ссылки на реальные примеры, буду очень признателен.

Dao:

public interface PersonDao extends GeneralDAO<PersonEntity>{
    public List<PersonEntity> searchName(String name);
    public List<PersonEntity> searchAllFields(
            String name,
            Integer age,
            City city);
}

В GeneralDAO описаны все стандартные методы типа get, save и т.д. Репозиторий:

@Repository
public interface PersonRepository extends JpaRepository<PersonEntity, Long> {
    List<PersonEntity> findByNameIgnoreCase(String name);
    List<PersonEntity> findByNameAndAgeAndCity(
            String name,
            Integer age,
            City city);
}

Сервис:

@Service
@Transactional
public class PersonService implements PersonRepository {
    @Autowired
    private PersonRepository personRepository;

    ...
    описание всех стандартных методов чтения-записи в БД

    @Override
    public List<PersonEntity> searchName(String name) {
        return productTypeRepository.findByNameIgnoreCase(name);
    }

    @Override
    public List<PersonEntity> searchAllFields(
            String name,
            Integer age,
            City city) {
        return personRepository.findByNameAndAgeAndCity(
                name,
                age,
                city);
    }
}

В контроллере обьявление и вызов:

@Autowired
private PersonService personService;
...

personService.searchAllFields(...);

Метод searchName прекрасно работает, а вот searchAllFields выдает всегда пустой список, даже если задаю одно имя, остальные = null

Попробовал в сервисе изменить метод:

 List<PersonEntity> findByNameIsNullAndAgeIsNullAndCityIsNull

На это Spring выдает ошибку: Error creating bean with name personRepository. At least 1 parameter(s) provided but only 0 parameter(s) present in query.


Ответы (1 шт):

Автор решения: Saidolim

Сделайте 1 метод и 1 запрос этого достаточно

к примеру:

.findByPersonNameAndAge(String name, Integer age, String city);

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

Select *
From Users
Where (user_name = name or name is null)
and (user_age = age or age is null)
and (user_city = city or city is null)

таким образом если у вас будем вызов .findByPersonNameAndAge(null, 25, null); тогда выведет всем кто 25 лет

→ Ссылка