Строка запроса с собственным запросом и упорядоченным параметром, sql не работает

#java #sql #spring-boot #spring-data-jpa #spring-el

#java #sql #весенняя загрузка #spring-data-jpa #spring-el

Вопрос:

У меня есть следующий код

   @Query(nativeQuery = true, value = "select  e.* from event e"
    " join league  l on (l.id = e.league_id)"
    " join sport s on (l.sport_id = s.id)"
    " join team t1 on (t1.id = e.team_one_id)"
    " join team t2 on (t2.id = e.team_two_id)"
    " join country c on (c.id = l.country_id)"
    " where l.name LIKE %?1%")

Page<Event> getAllEventsFiltered(final PageRequest of, final String filter);
  

Если выполнить этот SQL в базе данных, я получаю много результатов, но при выполнении из java я не получаю ни одного результата в том же SQL.

Я уже пробовал:

 where l.name LIKE %?#{escape([1])} escape ?#{escapeCharacter()}
  

но работает только для начала, и мне нужно как для начала, так и для конца.

Комментарии:

1. Какую базу данных вы используете?

Ответ №1:

Параметры JDBC могут быть включены только в очень определенные места в инструкции SQL. Они не заменяются как строки в инструкции SQL, но они применяются. Конкретные допустимые места меняются от базы данных к базе данных, а также зависят от варианта / версии драйвера JDBC.

Общее правило заключается в том, что параметр может быть применен там, где будет присутствовать единственное значение. Строковые параметры не должны заключаться в одинарные кавычки, как VARCHAR это было бы.

Один из вариантов сделать его совместимым — поместить параметр изолированно от другого текста, например, с помощью CONCAT() функции. Ваш запрос можно перефразировать как:

   @Query(nativeQuery = true, value = "select  e.* from event e"
    " join league  l on (l.id = e.league_id)"
    " join sport s on (l.sport_id = s.id)"
    " join team t1 on (t1.id = e.team_one_id)"
    " join team t2 on (t2.id = e.team_two_id)"
    " join country c on (c.id = l.country_id)"
    " where l.name LIKE concat('%', ?1, '%')") // change here
  

Тем не менее, конкретное изменение синтаксиса может отличаться в зависимости от используемой вами базы данных (которую вы не упомянули).