2013-07-01 17 views
16

例えば、私は次のクエリを作成したい:プレーンSQL SlickでIN句を使用することはできますか?

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

私の試みは失敗しました:

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

は、それが何らかの形でSlick普通のSQLクエリでin句を使用することは可能ですか?

+0

私が最も困惑しているのは、Slick's埋め込みを解除すると、これはほとんど簡単な作業です。 – Rogach

答えて

3

これを処理するために何も表示されません。あなたは最善の策は、おそらくこのようなものですね。

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

@Rogarch、物事が滑らかに変わったように、私の答えはもはや正しいものではありません。 – cmbaxter

+1

これは、補間が$の代わりに#$を使用するが、それでも非常に安全ではない場合に機能します。 :) http://slick.typesafe.com/doc/2.1.0/sql.html 'scala> sqlu" "" tbl_fooはx = 1を設定します。ここでyは#$ z "" " res30:scala.slickです。 jdbc.StaticQuery [単位、INT] = スカラ> res30.getStatement res31:(申し訳ありませんが、私はこれをフォーマットする方法は考えて '持たない文字列= "(1,2)のY、X = 1更新tbl_fooセット"うまく私は返品を挿入することはできません) – qu1j0t3

+1

滑らかさにも慣れていませんが、これはSQLiの脆弱性を導入していませんか?あるいは、 'sql' quasiquoteによって処理されますか? –

32

APIは、同様にこれをサポートしている「埋め込む持ち上げる」タイプセーフ:

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

+2

これが受け入れられる回答である必要があります。 – Tvaroh

+0

ありがとう、あなたは私の日を救った。 – vitalii

+2

ありがとう!私はSlick 3.0でもこれを使用することができました:query.filter(_。id inSet ids) – panther

2

それはSQLインジェクションのために安全ではないのですが、 #$インターポレータを使用することができます。

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