我想知道这是否可行,如果是的话,我确定它是一个简单的解决方案,我似乎无法弄清楚
@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)
基本上对于这个玩具示例,我试图选择一个列包含[任何文本] thingName [anyText]的行。当使用如上所述时,我认为引号模糊了绑定变量,因此它实际上查找[任何文本] :thingName [anyText]而不是我的绑定变量。
提前谢谢你, 麦德兰
答案 0 :(得分:19)
我使用concat用%符号包围输入,同时仍然使用绑定变量来避免SQL注入:
@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')")
public Set getNames(@Bind("thingName") String thingName);
答案 1 :(得分:12)
似乎必须将'%'百分比添加到绑定变量:
@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绑定东西创建一个预准备语句,并在这种情况下绑定name的值。您需要将%作为绑定值的一部分,或者您不需要对预准备语句使用绑定。
方法1(更安全,通常更好): “select ... from foo where name like:name”并绑定值(“%”+ name)
方法2(打开你的SQL注入):
“从foo中选择...其中名称如'%'”和define(“name”,name)(或在sql对象中,(@ define(“name”)名称) - 将名称作为文字放入你的陈述。
关键是%字符是您正在测试的值的一部分,而不是语句的一部分。