Фильтрация данных в таблице - как правильно организовать
Изучаю связку 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 шт):
Сделайте 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 лет