14

我想知道这是否/如何可能,如果是,我敢肯定这是一个我似乎无法弄清楚的简单修复

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

本质上,对于这个玩具示例,我试图选择一列包含 [any text]thingName[anyText] 的行。如上所述使用时,我认为引号会掩盖绑定变量,因此它实际上会查找 [any text] :thingName [anyText] 而不是我的绑定变量。

提前谢谢你,马德琳

4

2 回答 2

24

我使用 concat 用 % 符号包围输入,同时仍然使用绑定变量来避免 SQL 注入:

@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')")
public Set getNames(@Bind("thingName") String thingName);
于 2014-07-20T07:56:30.047 回答
13

您似乎必须将“%”百分比添加到绑定变量:

@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 绑定内容会创建一个准备好的语句并绑定 name 的值。您需要 % 成为绑定值的一部分,或者您不需要对准备好的语句使用绑定。

  • 方法 1(更安全且通常更好的方法):“select ... from foo where name like :name”并绑定值(“%”+ name)

  • 方法 2(这使您可以进行 sql 注入):

“select ... from foo where name like '%'” 和 define("name", name) (或在 sql 对象中, (@Define("name") name) - 将 name 作为文字放入您的语句中。

关键是 % 字符是您正在测试的的一部分,而不是语句的一部分。

于 2013-05-31T21:37:53.040 回答