【问题标题】:Anorm filter a query with LIKE clauseAnorm 使用 LIKE 子句过滤查询
【发布时间】:2017-01-17 14:09:39
【问题描述】:

使用 scala play anorm 和 mysql,我尝试进行 sql 查询,使用 LIKE 运算符进行过滤:

import java.sql.Connection
import anorm._

Class.forName("com.mysql.jdbc.Driver").newInstance()
implicit val conn = java.sql.DriverManager.getConnection(dbUrl)
val list = SQL"select firstName from person where lastName like '%tra%'".as(parser.*)

Exception in thread "main" java.lang.RuntimeException: No parameter value for placeholder: 1

这里它应该过滤所有 lastName 包含“tra”字符串的人。 为什么它不工作? 异常(或java dbc)是否将'%'视为特殊字符?如果是这样,如何逃脱?

【问题讨论】:

标签: scala anorm


【解决方案1】:

如果您希望 WHERE 子句类似于 '%pattern%',则必须在将其作为参数传递之前准备字符串。

SQL"""SELECT firstName FROM person WHERE lastName LIKE ${"%"+tra+"%"}""".
as(userParser.*)

【讨论】:

  • 谢谢。你能解释一下吗? '%' 是一个特殊字符吗?谁在这样做,异常(我不这么认为)或java sql?对此有任何参考吗?有可能逃脱吗?我尝试使用LIKE '\\%tra\\%' 或LIKE '!%tra!%' ESCAPE '!' 转义它,但没有成功。
  • '%' 是一个通配符(至少在 Oracle 中),因为。 MySQL JDBC 驱动程序将准备好的语句保存在客户端。因此,使用带有绑定变量的预处理语句要快得多,因为这意味着 Oracle 不必一次又一次地解析(编译)sql 语句。
  • JDBC 占位符是 ?:docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html 直接在 mysql 上执行原始查询(没有 JDBC)运行正常。您的示例可以简化为LIKE ${"%tra%"}。那么,这个 % 字符是由异常解释的吗?还是由谁?我需要这方面的参考。
  • % 由数据库解释。
猜你喜欢
  • 2017-04-22
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多