#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
Тем не менее, конкретное изменение синтаксиса может отличаться в зависимости от используемой вами базы данных (которую вы не упомянули).