#java #hibernate #spring-data-jpa
#java #спящий режим #spring-data-jpa
Вопрос:
Приведенный ниже запрос запускается в postgres SQL и выдает требуемый результат, но при попытке с JAVA выдает ошибку.
select * from res where
'{"^\d{3}\d{1,}133\d{1,}$","^\d{3}7483"}' is null
or exists (select from unnest(cast('{"^\d{3}\d{1,}133\d{1,}$","^\d{3}7483"}' as text[])) rx where cast (r.res_value as text) ~ rx);
java-код:-
@Query(value = "select * from res where
'{?1 is null
or exists (select from unnest(cast(?1 as text[])) rx where cast (r.res_value as text) ~ rx)",nativeQuery = true)
public List<Res> getData(List<String> patterns);
List of patterns =
^\d{3}\d{1,}133\d{1,}$
^\d{3}7483
Получение ошибки — «ОШИБКА: неверно сформированный литерал массива: ^ d{3} d{1,}133 d{1,} $ Подробно: значение массива должно начинаться с «{» или информации об измерении.
Как я могу добавить {} к этим .. любое решение в JPA
Комментарии:
1. не могли бы вы также опубликовать свой класс Res?
2. @sawim Res — это просто обычный объект, имеющий идентификатор, имя, значение и т.д. здесь проблема в том, что { } не передается, когда мы передаем список шаблонов.. таким образом, ожидается тот же формат, что и упомянутый мной верхний запрос, который отлично работает в postgres при выполнении direclty
Ответ №1:
Лучше преобразовать список строк в строку в java и передать его как String param в JPA-запрос.
Шаг 1: Преобразуйте список строк в строку в java перед передачей в JPA Java: String patternsStr = patterns.stream().map(p -> """ p """).collect(Collectors.joining(",", "{", "}"));
Шаг 2: Измените тип параметра из списка на строку в методе @Query JPA: public List<Res> getData(String patternsStr);
Упомянутый вами SQL-запрос postgres принимает массив regx в виде строки. Таким образом, легко передать список regx в виде строки в JPA-запрос.
Комментарии:
1. пробовал использовать приведенный выше шаблон подхода, который выглядит как {^ d{3} d {1,}133 d {1,} $,^ d {3}7483}, и поскольку это строка, она автоматически добавляется » (двойные кавычки в начале и конце). в идеале он должен начинаться с ‘(одинарная кавычка и заканчиваться одинарной кавычкой), а внутри этих шаблонов регулярных выражений должны быть двойные кавычки, подобные этому ‘{«^ \ d{3}\d{1,}133 \ d{1,}$»,»^\ d{3}7483″}’ Следовательно, ниже приведена ошибка ОШИБКА: неверно сформированный литерал массива: «{^ d{3} d{1,}133 d {1,} $,^ d {3}7483}» Деталь: неожиданный символ «{«.
2. «{«.concat(StringUtils .wrap(StringUtils .join(searchPattern, «», «»), «»»). заменить(«\», «\\»)) . concat(«}») Это сработало для меня
3. Для шаблона регулярных выражений в двойных кавычках строки шаблонов. Просто добавьте функцию сопоставления в поток для добавления кавычек с обоих концов. В вашем случае будет работать добавленная ниже строка списка преобразователя строки в строку. String patternsStr = patterns.stream().map(p -> «»» p «»»).собирать (Коллекторы.объединение(«,», «{«, «}»));
4. Интересно, вводит ли это решение уязвимость SQL-инъекции в ваш код