2015-05-04 57 views
2

我可以在子句使用带有ScalikeJDBC的SQL插值?例如在与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')

回答

4

我还没有想通了您的问题,但插值设定值应该工作。

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] = [email protected] 

scala> s.statement 
res1: String = update foo set bar=1 where id in (?, ?, ?, ?) 

scala> s.parameters 
res2: Seq[Any] = List(1, 2, 3, 5) 
+1

你说的很正确。我不知道我以前做错了什么。我已经回到我以为我最初尝试过的方式,现在正在工作。ありがとう – Synesso

+0

不知道是原因的OP的问题,但是如果你不小心使用Java集合,你静静地得到异常插值行为:'斯卡拉> SQL“”“更新富集酒吧= 1,其中身份证件($ {集(5, 1,2,3,4).asJava}) “”” statement'给出 'RES2:字符串=更新FOO组巴= 1其中id在()'?。这对我造成了一些问题;我可能会针对scalikejdbc提交一个错误。 –

+0

我提起[ScalikeJDBC错误](https://github.com/scalikejdbc/scalikejdbc/issues/469)。 –