2013-05-31 4 views
12

мне интересно, если/как это возможно, если это так, я уверен, что его легко исправить, что я не могу показаться, чтобы выяснитьJDBI с использованием @bind для переменных в запросах внутри цитаты

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

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

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

+0

Вы должны изменить принятый ответ на решение конкатенации. Существует способ сделать это без внесения изменений кода, которые могут привести к ошибке. –

ответ

9

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

@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

Цитата из Brian McCallister

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

  • подход 1 (тем безопаснее и лучше вообще один): "выберите ... из обув где имя как: имя" и связать значение ("%" + имя)

  • подход 2 (который открывает вам до SQL Injection):

"выберите ... из обув, где имя как '%'" и определить ("имя", имя) (или в SQL объекта (@Define ("имя") имя) - который помещает имя в качестве литерала в ваш отчет.

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

+0

Благодарим вас за ответ! Это то, что я сделал, я надеялся, что там будет лучший выход, но, похоже, нет. - Madeline – user2441922

+0

Ответ ниже, используя операцию конкатенации, является лучшим ответом, поскольку он не требует логических изменений. Если вы используете postgres, вы можете сделать ''% '|| : термин || '%' –

16

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

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