【问题标题】:JDBI using @bind for variables in queries inside quotesJDBI 使用 @bind 查询引号内的变量
【发布时间】:2013-05-27 18:58:20
【问题描述】:

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

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

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

提前谢谢你, 玛德琳

【问题讨论】:

  • 您应该将接受的答案更改为串联解决方案。有一种方法可以做到这一点,而无需进行可能引入错误的代码更改。

标签: objectquery jdbi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    @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 '%'" and define("name", name) (或在 sql 对象中,(@Define("name") name) -- 将 name 作为文字放入你的声明。

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

    【讨论】:

    • 感谢您的回复!这就是我所做的,我希望那里有更好的方法,但似乎没有。 - 玛德琳
    • 下面使用连接操作的答案是一个更好的答案,因为它不需要逻辑更改。如果你使用 postgres,你可以做 ''%' || :期限 || '%'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2017-02-21
    • 2019-05-05
    • 2012-05-17
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多