2013-07-01 12 views
16

, aşağıdaki sorgu oluşturmak istiyorum:IN deyimini düz sql Slick'de kullanmak mümkün mü? Örneğin

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

Benim girişimi başarısız oldu:

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

bir şekilde Slick düz sql sorguları in maddesini kullanmak mümkün mü?

+0

En çok ne yapmam, Slick'in gömülü yerleştirme, bu neredeyse zahmetsiz bir iştir. – Rogach

cevap

3

Bunu işlemek için kutudan hiçbir şey göremiyorum. Sen iyi bahis muhtemelen böyle bir şeydir konum:

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

@Rogarch, şeyler kaygan olarak değişti ve cevabım artık doğru değil, kabul edilen cevabı lütfen aşağıdaki gibi değiştirebilir misiniz? – cmbaxter

+1

Bu, enterpolasyon $ yerine $ $ kullanıyorsa işe yarar, ancak yine de çok güvensizdir. :) http://slick.typesafe.com/doc/2.1.0/sql.html 'scala> sqlu" "" tbl_foo kümesini güncelle x = 1 Burada y # y $ z "" " res30: scala.slick. jdbc.StaticQuery [Birim, Int] = scala> res30.getStatement res31: string = "update tbl_foo seti x = 1 nerede y (1,2)" '(üzgünüm ben nasıl bu biçimlendirmek için hiçbir fikrim yok Iade ekleyemiyorum güzel) – qu1j0t3

+1

Çok kaygan değil, ama bu bir SQLi güvenlik açığı tanıtmıyor mu? Yoksa 'sql' quasiquote tarafından ele alınır? –

2

SQL enjeksiyon için güvenli olmasa da , #$ ara değerini kullanabilirsiniz:

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