2013-07-01 11 views
16

Per esempio, voglio creare la seguente query:È possibile utilizzare la clausola IN in plain sql Slick?

SELECT c.* FROM Coffees c WHERE c.name IN ('robusta', 'arabica') 

Il mio tentativo è fallito:

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]] 

E 'possibile usare in qualche modo in clausola Slick query SQL semplici?

+0

Ciò che mi indovina di più è che in Slick embedding sollevato, questo è quasi un compito senza sforzo. – Rogach

risposta

3

Non vedo niente fuori dalla scatola per gestire questo. Sei migliore da fare è probabilmente qualcosa di simile:

val cnames = List("robusta", "arabica").map("'" + _ + "'").mkString(",") 
val query = sql""" SELECT c.* FROM Coffees c WHERE c.name IN (${cnames}) """ 
+0

@Rogarch, poiché le cose sono cambiate in grassetto e la mia risposta non è più corretta, potresti cambiare la risposta accettata a quella qui sotto in modo da poter cancellare questa risposta? – cmbaxter

+1

Funzionerà se l'interpolazione utilizza # $ anziché $, ma è ancora molto pericoloso. :) http://slick.typesafe.com/doc/2.1.0/sql.html 'scala> sqlu" "" aggiorna tbl_foo set x = 1 dove y in # $ z "" " res30: scala.slick. jdbc.StaticQuery [Unità, Int] = scala> res30.getStatement res31: String = "set aggiornamento tbl_foo x = 1 dove y a (1,2)" '(scusate non hanno idea di come formattare questo bene quando non riesco a inserire i ritorni) – qu1j0t3

+1

Non ho familiarità con lo slick, ma questo non introduce una vulnerabilità SQLi? O è gestito dalla quasiquote 'sql'? –

2

Anche se non è sicuro per l'iniezione SQL , è possibile utilizzare l'interpolatore #$:

val ids = idList.map("'" + _ + "'").mkString(",") 
val q = sql"""select name from mytable where id in (#$ids)""" 
Problemi correlati