【问题标题】:In clauses with sql interpolation在带有 sql 插值的子句中
【发布时间】:2015-07-13 09:31:12
【问题描述】:

我可以在 ScalikeJDBC 的 SQL 插值中使用子句吗?例如

val ids = Set(1,2,3,5)
sql"""update foo set bar=${bar} where id in ${ids}""".update().apply()

这失败了,因为ids 没有被插值。

sql"""update foo set bar=${bar} where id in (${ids.mkString(",")})""".update().apply()

这也失败了,因为表达式被解释为字符串,而不是数字列表。例如... where id in ('1,2,3,5')

【问题讨论】:

    标签: scala scalikejdbc


    【解决方案1】:

    我还没有弄清楚您的问题,但是插值 Set 值应该可以工作。

    libraryDependencies ++= Seq(
      "org.scalikejdbc" %% "scalikejdbc"       % "2.2.6",
      "com.h2database"  %  "h2"                % "1.4.187",
      "ch.qos.logback"  %  "logback-classic"   % "1.1.3"
    )
    

    像这样:

    scala> import scalikejdbc._
    import scalikejdbc._
    
    scala> val ids = Set(1,2,3,5)
    ids: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
    
    scala> val s = sql"""update foo set bar=1 where id in (${ids})"""
    s: scalikejdbc.SQL[Nothing,scalikejdbc.NoExtractor] = scalikejdbc.SQLToTraversableImpl@633229c7
    
    scala> s.statement
    res1: String = update foo set bar=1 where id in (?, ?, ?, ?)
    
    scala> s.parameters
    res2: Seq[Any] = List(1, 2, 3, 5)
    

    【讨论】:

    • 你说的很对。我不知道我之前做错了什么。我已经回滚到我认为我最初尝试过的东西,现在它正在工作。ありがとう
    • 不确定是否是 OP 问题的原因,但如果您不小心使用了 Java 集合,您会默默地得到异常的插值行为:scala> sql"""update foo set bar=1 where id in (${Set(5, 1, 2, 3, 4).asJava})""".statement 给出res2: String = update foo set bar=1 where id in (?)。这给我带来了一些问题;我可能会针对 scalikejdbc 提交一个错误。
    • 我提交了ScalikeJDBC bug
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多