Подтвердить что ты не робот

JDBI с использованием @bind для переменных в запросах внутри кавычек

Мне интересно, если это возможно, если это так, я уверен, что это простое исправление, которое я не могу понять.

@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)

По существу для этого примера игрушек я пытаюсь выбрать строку, в которой столбец содержит [любой текст] thingName [anyText]. При использовании, как указано выше, я думаю, что кавычки скрывают связанную переменную, поэтому она буквально ищет [любой текст] : thingName [anyText], а не мою связанную переменную.

Заранее спасибо, Мэдлин

4b9b3361

Ответ 1

Похоже, что вы должны добавить проценты% к связанной переменной:

@SqlQuery("SELECT * FROM Table WHERE column LIKE :thingName")
public Set<Things> getThings(@Bind("thingName") String thingName); // where thingName = "%" + thingName + "%"

Смотрите также: https://groups.google.com/forum/?fromgroups#!topic/jdbi/EwUi2jAEPdk

Цитата от Брайана Маккаллистера

Использование файла привязки: foo создает подготовленный оператор и связывает его значение в этом случае. Вам нужно, чтобы% было частью связанного значения, или вам не нужно использовать привязки к подготовленному оператору.

  • Подход 1 (более безопасный и, как правило, лучший): "выберите... из foo, где name like: name" и привяжите значение ( "%" + имя)

  • Подход 2 (который открывает вас до SQL-инъекции):

"выберите... из foo, где имя типа '%'" и define ( "name", name) (или в sql-объекте, (имя @Define ( "name" )), которое помещает имя в качестве литерала в ваше выражение.

Главное, что символ% является частью значения, которое вы тестируете, а не является частью инструкции.

Ответ 2

Я использую concat для объемного ввода с символами%, все еще использую связанную переменную, чтобы избежать SQL-инъекции:

@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')")
public Set getNames(@Bind("thingName") String thingName);