LINUX.ORG.RU

[Java][JDBC] Prepared запрос с LIKE

 ,


0

1

Помогите составить правильно запрос, содержащий LIKE. Написал так:

searchBookStat = conn.prepareStatement("SELECT * FROM books "
                        + "WHERE ? LIKE '%?%';");
searchBookStat.setString(1, category);
searchBookStat.setString(2, text);
searchBookStat.addBatch();
Падает на строке «searchBookStat.setString(2, »%" + text + «%»);" с таким исключением «java.lang.ArrayIndexOutOfBoundsException: 1».

★★★★★

Ответ на: комментарий от hippi90

Насколько я помню, так нельзя параметризовать имя поля. Только значение. Если и прав, category надо туда запихивать явно. В крайнем случае черезе MessageFormat, если хочется поизвращаться.

svu ★★★★★
()
Ответ на: комментарий от hippi90

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

earchBookStat = conn.prepareStatement("SELECT * FROM books "
                        + "WHERE category LIKE ?");
searchBookStat.setString(1, text);
searchBookStat.addBatch();

Prepared statements не предназначены для создания шаблонов запросов, а для предотвращения sql injection и им подобных атак.

В случае многократных запросов в течении одной сессии возможен выйгрыш в скорости за счет того что не нужно будет анализировать запрос каждый раз.

hidden_4003
()
Ответ на: комментарий от hidden_4003

Спасибо, не знал! Сделал так:

searchBookStat = conn.prepareStatement("SELECT * FROM books "
                        + "WHERE " + category + " LIKE ?");
searchBookStat.setString(1, text);
Всё равно падает на executeQuery(): «java.sql.SQLException: assertion failure: param count (1) != value count (2)»

hippi90 ★★★★★
() автор топика
Ответ на: комментарий от hippi90

Что за база? Что за дрова jdbc-шные? Поддерживают ли эти дрова like - может, там известный глюк какой...?

svu ★★★★★
()
Ответ на: комментарий от hippi90

Вы точно убрали второй setString? Судя по ошибке присваивается два значения, а маркер только один.

hidden_4003
()
Ответ на: комментарий от hidden_4003

Скачать исходники. Загнать в дебаггер. Узнать, откуда берется второе значение. Либо Вы чего-то не договариваете нам, либо там бага.

svu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.