Как написать запрос в Spring Data JPA с несколькими обнуляемыми параметрами? - PullRequest
0 голосов
/ 28 января 2019

У меня есть класс Entity, подобный этому:

class EntityClass {
    UUID id;
    String param1, param2, param3;
    //Getters and Setters
}

Мой класс Service будет иметь такой метод, чтобы использовать все подобные столбцы, и я хочу иметь возможность обрабатыватьвсе запросы с одним и тем же методом репозитория вместо написания нескольких методов репозитория для каждого случая, когда комбинация параметров равна нулю.

class ServiceClass {
    List<EntityClass> getAllBy(List<String> param1, List<String> param2, String param3) {
        return repositoryInterface.customFindAll(param1, param2, param3);
    }
}

Теперь мой класс репозитория должен иметь этот метод.Но я хочу иметь возможность обрабатывать случай, когда любая комбинация {param1, param2, param3} может быть нулевой, как в {param1 = null или empty, param2! = Null, param3! = Null} или {param1 = null или empty, param2 = null или empty, param3! = null} и т. д.

Метод репозитория customFindAll должен в основном иметь возможность поиска в таблице сущностей, чтобы проверить, присутствует ли значение столбца param1 в каком-либо из списков отправленных значений и т. д.если нет null.

Итак, как мне обрабатывать нативный запрос в JPA весной, чтобы сделать это вместо создания разных методов для разных комбинаций?

interface RepositoryInterface extends JpaRepository<EntityClass, UUID> {
    @Query(value = "FILL THE QUERY", nativeQuery = true)
    List<EntityClass> customFindAll(@Param("param1") List<String> param1, @Param("param2") List<String> param2, @Param("param3") String param3)
}

1 Ответ

0 голосов
/ 29 января 2019

Общий подход к этому заключается в использовании предложения where, такого как:

WHERE (:param1 IS NULL OR param1 IN :param1) ...

Но я не думаю, что вы можете выполнить проверку is null для параметра связывания со списком.Но вы можете использовать выражения SpEL для этого .

Это должно сработать:

SELECT id, param1, param2, param3
FROM EntityClass
WHERE (:#{#param1 == null ? 0 : 1} = 0 OR param1 IN :param1) 
AND   (:#{#param2 == null ? 0 : 1} = 0 OR param2 IN :param2) 
AND   (:#{#param3 == null ? 0 : 1} = 0 OR param3 IN :param3) 

Комментарий, вероятно, прав: IN на пустом или *Параметр 1013 * может просто не анализироваться как допустимый оператор SQL.В этом случае вы можете использовать еще больше силы SpEL (повторите три раза, как указано выше):

( param1 IN :#{(#param1 == null || #param1.isEmpty()) ? java.util.Collections.singletonList(#param1) : #param1})

Конечно, все это становится довольно уродливым, поэтому вам лучше будет создавать свой запрос динамически, используяТехнические характеристики .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...