我正在尝试创建一个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")
答案 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
。