2015-09-30 18 views
6

クエリに追加条件を追加する際に苦労しています。最も単純な形式では、私が必要なのは、以下のようなものです:#$を使用して動的条件を使用したSlick Plain SQLクエリ

def findPeople(name: String, maybeSurname: Option[String]) = { 
    val sql1 = sql"select * from my_table where name = $name" 
    val sql2 = maybeSurname.map(surname => sql"and col2 = $surname").getOrElse(sql"") 
    val finalSql = sql1 + sql2 // I need this kind of feature 
    ... 
    ... 
} 

はオプションかもしれないが、その後、姓は大きな問題であるバインド変数、ではないでしょう。

答えて

0

バインド変数はマップ関数によって解釈されないと思います。これらは、Slick sqlインターポレータによって解釈されます。だからあなたのsql2は姓の値を取得しません。

SQL文を作成する必要がある場合は、Plain SQL機能を使用しないと考えられます。 .filter(.name ==== name).filter(。col2 === surname)だけでもいいですか?ここ

+0

である私のクエリは、私は普通のSQLを使用している理由です、はるかに複雑これ以上です。 – Feyyaz

+0

'sql2'は部分的なクエリだと思っていましたが、これは現時点では不可能です。 'maybeSurname.map'を意味するなら、それは' Option'のためのものであり、バインド変数のためのものではありません。 – Feyyaz

4

が滑らかな3.1.xへのサンプルテスト

import slick.jdbc.{SQLActionBuilder, SetParameter, PositionedParameters} 

object SlickKit { 

    implicit class SQLActionBuilderConcat (a: SQLActionBuilder) { 
    def concat (b: SQLActionBuilder): SQLActionBuilder = { 
     SQLActionBuilder(a.queryParts ++ b.queryParts, new SetParameter[Unit] { 
     def apply(p: Unit, pp: PositionedParameters): Unit = { 
      a.unitPConv.apply(p, pp) 
      b.unitPConv.apply(p, pp) 
     } 
     }) 
    } 
    } 
} 

、その後

import SlickKit._ 
val sql1 = 
    sql""" 
    select count(*) from idinfo_#$i 
    """ 

val sql2 = 
    sql""" 
     where source=$source 
    """ 

val sql = sql1 concat sql2 

sql.as[Int].head