2015-05-04 66 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)。 –