scala - ¿Es posible utilizar la cláusula IN en sql simple Slick?
scala-2.10 (4)
Aunque no es seguro para la inyección de SQL, puede usar #$
interpolator:
val ids = idList.map("''" + _ + "''").mkString(",")
val q = sql"""select name from mytable where id in (#$ids)"""
Por ejemplo, quiero crear la siguiente consulta:
SELECT c.* FROM Coffees c WHERE c.name IN (''robusta'', ''arabica'')
Mi intento fracasó:
val cnames = List("robusta", "arabica")
sql""" SELECT c.* FROM Coffees c WHERE c.name IN ${cnames} """
could not find implicit value for parameter pconv:
scala.slick.jdbc.SetParameter[List[String]]
¿Es posible utilizar de alguna manera in
cláusula en las consultas Slick
plain sql?
Hay una biblioteca que (entre otras cosas) introduce un cuaderno para las propiedades de la lista en el interpolador SQL de Slick: https://index.scala-lang.org/tarao/slick-jdbc-extension-scala/slick-jdbc-extension
Código de ejemplo de la página:
import util.NonEmpty
def findAll(entryIds: Option[NonEmpty[Long]]): Seq[Entry] = entryIds match {
case Some(ids) => run { sql"""
| SELECT * FROM ${table}
| WHERE entry_id IN $ids
""".as[Entry] }
case None => Seq.empty
}
La API de "incrustación levantada" de tipo seguro también admite esto:
val ids = List(1,2,3)
val q = for {
f <- Foo if f.id inSet ids // ids is not bound
}
slick.typesafe.com/doc/1.0.1/api/index.html#scala.slick.lifted.ColumnExtensionMethods
No veo nada fuera de la caja para manejar esto. Su mejor apuesta es probablemente algo como esto:
val cnames = List("robusta", "arabica").map("''" + _ + "''").mkString(",")
val query = sql""" SELECT c.* FROM Coffees c WHERE c.name IN (${cnames}) """