динамический запрос данных хранилища Spring для фильтрации нескольких параметров - PullRequest
1 голос
/ 08 июля 2019

У меня есть класс 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)

}

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

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);
        }
....

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

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

1 Ответ

0 голосов
/ 08 июля 2019

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

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

@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[] {}));
        }

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

...