Выберите несколько полей, используя findByField в JPA - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь выбрать несколько значений из таблицы, в которой вход может быть любым из 5 столбцов таблицы или комбинацией этих полей.

Чтобы использовать findByField в JPA, мне нужно много комбинацийof findByField и вызывайте их выборочно, проверяя, какое поле является пробелом.

Есть ли более простое решение для этого?

У меня есть 5 столбцов в таблице, к которой я хотел бы обратиться.

Если пользователь вводит все 5, тогда я хочувыберите, используя все 5 полей, как показано ниже.

select * from table where field1 = :field1 and field2 = :field2 and field3 = :field3 and field4 = :field4 and field5 = :field5;

Но если пользователь вводит только 2 поля, я просто хочу запросить эти 2 поля, как это.

select * from table where field3 = :field3 and field5 = :field5.

В JPA мымогу сделать findByField1AndField2AndField3

Но у меня есть для 5 различных возможностей ввода, мне придется создать около 120 возможностей.

Так есть ли более простое решение?

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Кажется, что нет автоматического генератора для создания всех возможных комбинаций запросов JPA, но вы должны использовать мощь динамических запросов JPA, например:

Создание предикатов для всех полей и их применение на основе пользовательского ввода.

public List<Employee> findByCriteria(String employeeName){
        return employeeDAO.findAll(new Specification<Employee>() {
            @Override
            public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates = new ArrayList<>();
                if(employeeName!=null) {
                    predicates.add(criteriaBuilder.and(criteriaBuilder.equal(root.get("employeeName"), employeeName)));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        });
    }

Полезная ссылка: https://javadeveloperzone.com/spring/spring-jpa-dynamic-query-example/

0 голосов
/ 13 мая 2019

Вы можете использовать пользовательский @Query в вашем @Repository интерфейсе и добавлять столько параметров, сколько вам нужно.

 @Query(value="SELECT *
               FROM table
               WHERE (:field1 IS NULL
                      OR field1 = :field1)
               AND (:field2 IS NULL
                    OR field2 = :field2)",
        nativeQuery=true)
 public Table findMatchingTable(@Param("field1") String field1, @Param("field2") String field2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...