Anorm фильтрует запрос с предложением LIKE

Используя scala play anorm и mysql, я пытаюсь сделать sql-запрос, фильтруя с помощью оператора LIKE:

import java.sql.Connection
import anorm._

Class.forName("com.mysql.jdbc.Driver").newInstance()
implicit val conn = java.sql.DriverManager.getConnection(dbUrl)
val list = SQL"select firstName from person where lastName like '%tra%'".as(parser.*)

Exception in thread "main" java.lang.RuntimeException: No parameter value for placeholder: 1

здесь он должен отфильтровать всех лиц, чья фамилия содержит строку «tra». почему это не работает? анорм (или java dbc) рассматривает «%» как специальный символ? если да, то как этого избежать?


person David Portabella    schedule 17.01.2017    source источник
comment
Возможный дубликат предложения Anorm LIKE с интерполяцией строк   -  person cchantep    schedule 17.01.2017


Ответы (1)


Если вы ожидаете, что предложение WHERE будет чем-то вроде '%pattern%', вам придется подготовить строку, прежде чем передавать ее в качестве аргумента.

SQL"""SELECT firstName FROM person WHERE lastName LIKE ${"%"+tra+"%"}""".
as(userParser.*)
person Deden Bangkit    schedule 17.01.2017
comment
Спасибо. Вы можете это объяснить? является ли «%» особенным символом? кто этим занимается, анорм (я так не думаю) или java sql? любая ссылка на это? можно ли его избежать? я пытался избежать его с помощью LIKE '\\%tra\\%' или LIKE '!%tra!%' ESCAPE '!', но не сработало. - person David Portabella; 17.01.2017
comment
'%' - это подстановочный знак (по крайней мере, в Oracle), так как. Драйвер MySQL JDBC сохраняет подготовленные операторы на стороне клиента. Таким образом, использование подготовленных операторов с переменными связывания происходит намного быстрее, поскольку это означает, что Oracle не нужно снова и снова анализировать (компилировать) операторы sql. - person Deden Bangkit; 17.01.2017
comment
заполнитель JDBC: ?: docs.oracle.com/javase/tutorial/ jdbc/basics/prepared.html Выполнение исходного запроса непосредственно в mysql (без JDBC) выполняется нормально. ваш пример можно упростить как LIKE ${"%tra%"}. Итак, этот символ% интерпретируется анормом? или кем? мне нужна ссылка на это. - person David Portabella; 17.01.2017
comment
% интерпретируется базой данных. - person Michael Zajac; 17.01.2017