2013-07-01 6 views
16

Zum Beispiel möchte ich die folgende Abfrage erstellen:Ist es möglich, IN-Klausel in Plain sql Slick zu verwenden?

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

Mein Versuch fehlgeschlagen:

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

Ist es möglich, irgendwie in Slick Abfragen Ebene SQL in Klausel zu verwenden?

+0

Was mich am meisten verwirrt, ist das in Slick's Aufhebung der Einbettung, das ist fast eine mühelose Aufgabe. – Rogach

Antwort

3

Ich sehe nichts aus der Box, um damit umzugehen. Sie sind beste Wette ist wahrscheinlich so etwas wie folgt aus:

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

@Rogarch, da sich die Dinge in Slick geändert haben und meine Antwort nicht mehr korrekt ist, könntest du bitte die angenommene Antwort auf die unten stehende ändern, damit ich diese Antwort löschen kann? – cmbaxter

+1

Dies funktioniert, wenn die Interpolation # $ anstelle von $ verwendet, aber immer noch sehr unsicher ist. :) http://slick.typesafe.com/doc/2.1.0/sql.html 'scala> sqlu" "" update tbl_foo gesetzt x = 1 wo y in # $ z "" " res30: scala.slick. jdbc.StaticQuery [Unit, Int] = scala> res30.getStatement RES31: String = "update tbl_foo Set x = 1, wobei y in (1,2)" '(sorry ich habe keine Ahnung, wie diese zu formatieren schön wenn ich keine Retouren einfügen kann) – qu1j0t3

+1

Nicht so glatt mit Slick, aber führt dies nicht zu einer SQLi Schwachstelle? Oder wird es von der 'sql'-Quasiquote behandelt? –

2

Obwohl es für SQL-Injection nicht sicher ist, Sie können #$ verwenden interpolator:

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