Scala Play 异常 : Placeholder not replaced

标签 scala playframework h2 anorm

我刚刚开始使用 Anorm,偶然发现了一个奇怪的行为。当我尝试执行以下操作时:

val userTableName: String = "User"
SQL("INSERT INTO {userTableName} (email, forename, surname, refreshToken) VALUES ({email}, {forename}, {surname}, {refreshToken})")
        .on("userTableName" -> userTableName,
            "email"->email,
            "forename"->forename,
            "surname"->surname,
            "refreshToken"->refreshToken).executeInsert()

我出现以下错误:

play.api.Application$$anon$1: Execution exception[[JdbcSQLException: Syntax error in SQL statement "INSERT INTO ?[*] (EMAIL, FORENAME, SURNAME, REFRESHTOKEN) VALUES (?, ?, ?, ?) "; expected "identifier"; SQL statement:
INSERT INTO ? (email, forename, surname, refreshToken) VALUES (?, ?, ?, ?) [42001-175]]]
    at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.8.jar:2.3.8]
    at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.8.jar:2.3.8]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:205) [play_2.11-2.3.8.jar:2.3.8]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:202) [play_2.11-2.3.8.jar:2.3.8]
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36) [scala-library-2.11.1.jar:na]
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT INTO ?[*] (EMAIL, FORENAME, SURNAME, REFRESHTOKEN) VALUES (?, ?, ?, ?) "; expected "identifier"; SQL statement:
INSERT INTO ? (email, forename, surname, refreshToken) VALUES (?, ?, ?, ?) [42001-175]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:332) ~[h2-1.3.175.jar:1.3.175]
    at org.h2.message.DbException.getSyntaxError(DbException.java:197) ~[h2-1.3.175.jar:1.3.175]
    at org.h2.command.Parser.readIdentifierWithSchema(Parser.java:2926) ~[h2-1.3.175.jar:1.3.175]
    at org.h2.command.Parser.readTableOrView(Parser.java:5049) ~[h2-1.3.175.jar:1.3.175]
    at org.h2.command.Parser.parseInsert(Parser.java:995) ~[h2-1.3.175.jar:1.3.175]

如果我对表名称进行硬编码

SQL("INSERT INTO User (email, forename, surname, refreshToken) VALUES ({email}, {forename}, {surname}, {refreshToken})")
        .on("email"->email,
            "forename"->forename,
            "surname"->surname,
            "refreshToken"->refreshToken).executeInsert()

它有效。我解决了这个问题,但最好不要出于重构原因对表名进行硬编码。为什么在这种情况下我不能使用 Anorm 的动态映射功能?

最佳答案

正如 m-z 所说,语法 {placeholder} 仅适用于参数(当后跟 .on("placeholder", value) 时)。

您可以将纯字符串插值与此语法 SQL(s"SELECT $table ... {id}") 混合使用。

关于Scala Play 异常 : Placeholder not replaced,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29800786/

相关文章:

scala - "for (i <- 1 to x; j <- 1 to y)"实际上如何增加 Scala 中的变量?

java - 连接表上没有主复合键的 JPA @ManyToMany 关系

playframework - 如何使 typebinder 仅对特定内容类型有效?

model-view-controller - 授权应该是模型或 Controller 的一部分吗?

java - 如何控制 Grails 3 Gradle 项目中的 H2 驱动程序版本?

java - H2 JDBC 准备语句异常

timestamp - 将unix时间戳转换为H2时间戳

scala - 模式匹配中的隐式

arrays - Scala:子数组

scala - Yarn 集群模式下 Spark 作业的 ClassNotFoundException