динамический запрос данных репозитория spring для фильтра с несколькими параметрами

У меня есть класс Entity с 5 параметрами: имя, семья, электронная почта, адрес, возраст. Поиск по отдельности или в группах должен быть динамичным. Это в ситуации, что если я хочу написать один, все место занято. Как я могу написать им динамическую очередь?

@Repository
public interface MyRepository extends JpaRepository<MyEntity1, Long> {
    Page<DirectTopup> findAllByName(Pageable pageable, String name);
    Page<DirectTopup> findAllByNameAndFamily(Pageable pageable, String name, , String family);
    Page<DirectTopup> findAllByNameAndFamilyAndEmail(Pageable pageable, String name, , String family, String email);

...

    Page<DirectTopup> findAllByNameAndFamilyAndEmail(Pageable pageable, String name, , String family, String email, String address, int age)

}

Для каждого возможного вызова Параметрарий — это Зер и Нал или вообще ничего. пожалуйста, порекомендуйте

if (name != null && family == null && email == null && address == null && age ==null){
myRepository.findAllByName(new PageRequest(page, size, direction, propertie), name);
}

if (name == null && family != null && email == null && address == null && age ==null){
    myRepository.findAllByFamily(new PageRequest(page, size, direction, propertie), family);
    }

... и все параметры

Все разделенные значения разделены.

    if (name != null && family != null && email != null && address == null && age ==null){
        myRepository.findAllByNameAndFamilyAndEmail(new PageRequest(page, size, direction, propertie), name, family, email);
        }
....

И объедините их (несколько параметров):

и это может быть комбинация параметров


person sadeghiismael    schedule 08.07.2019    source источник
comment
Возможный дубликат Фильтрация данных с помощью Spring boot CrudRepository   -  person Alan Hay    schedule 08.07.2019


Ответы (1)


Для этого сценария можно использовать интерфейс спецификации. Перейдите по этой ссылке.

как только вы перейдете по ссылке выше, используйте этот предикат для динамической фильтрации столбцов, используйте этот предикат:

@Override
        public Predicate toPredicate(Root<MyEntity1> root, CriteriaQuery<?> query, CriteriaBuilder cb) 
        {
            List<Predicate> predicates = new ArrayList<Predicate>();


            if(StringUtils.isNotEmpty(name))
            {
                predicates.add(cb.like(cb.lower(root.get("name")), "%"+name.toLowerCase()+"%"));
            }

            if(StringUtils.isNotEmpty(family))
            {
                predicates.add(cb.like(cb.lower(root.get("family")), "%"+family.toLowerCase()+"%"));
            }

            return cb.and(predicates.toArray(new Predicate[] {}));
        }

Этот пример также будет полезен.

person Pratik soni    schedule 08.07.2019
comment
Это предложение совсем не верное. Тем не менее, у нас будет полный запрос. Объем запросов увеличивается. - person sadeghiismael; 09.07.2019
comment
Могу я узнать, что означает «запрос»? Вы имеете в виду в запросе? - person Pratik soni; 09.07.2019
comment
запрос, извините. @Пратик Сони - person sadeghiismael; 09.07.2019