2015-05-04 2 views
2

Могу ли я использовать внутри-предложения с помощью SQL Interpolation от 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() 

Это также терпит неудачу, потому что выражение intepreted как строка, а не список чисел. например ... where id in ('1,2,3,5')

ответ

4

Я не понял вашу проблему, но интерполировать значение 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] = [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, вы без проблем получаете аберрантное интерполяционное поведение: 'scala> sql" "" update foo set bar = 1 где id in ($ {Set (5, 1, 2, 3, 4) .asJava}) "" ". Statement' дает ' res2: String = update foo set bar = 1 где id в (?) '. Это вызвало некоторые проблемы для меня; Я могу указать ошибку в файле scalikejdbc. –

+0

Я подал ошибку [ScalikeJDBC] (https://github.com/scalikejdbc/scalikejdbc/issues/469). –

Смежные вопросы