使用`on`替换Scala SQL查询中的占位符

时间:2014-02-06 16:28:18

标签: sql scala playframework-2.0 anorm

我正在尝试创建一个findBy方法,该方法接受一个键和值来搜索表。出于某种原因,以下内容没有找到任何内容:

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection =>
  SQL("select * from authentications where {key}='{value}' limit 1")
    .on("key" -> key, "value" -> value).as(authentication.singleOpt)
}

但是当我只使用加号时,确实如此。我不介意这样离开,但能够使用on

有好处
def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection =>
  SQL("select * from authentications where " + key + "='" + value + "' limit 1")
    .as(authentication.singleOpt)
}

示例查询:Authentication.findBy("email", "test@example.com")

1 个答案:

答案 0 :(得分:2)

Play在准备好的SQL语句中转义查询参数。因此,您实际上不需要将{value}包装在单引号中。不幸的是,这意味着列名称将使用引号和Play进行转义,因此它将被数据库解释为字符串。如果不使用字符串连接或字符串插值,我没有看到这种方法。

Scala字符串插值看起来代码看起来好一点:

def findBy(key: String, value: String): Option[Authentication] = DB.withConnection { implicit connection =>
    SQL(s"select * from authentications where `$key` = {value} limit 1")
       .as(authentication.singleOpt)
       .on("value" -> value).as(authentication.singleOpt)
}

注意字符串开头之前的“s”。 scala编译器将使用范围内的字符串$key替换标记key。这应该有效,但key不会被转义。因此,您必须自己清理key的输入,除非您仅在内部使用它。此外,请务必注意,表中不是列的key输入会引发SQLException