2015-09-30 11 views
6

Mam problemy z dołączaniem dodatkowych warunków do mojego zapytania. W najprostszej formie, co potrzebne jest coś takiego jak poniżej:Zwykłe kwerendy SQL z dynamicznymi warunkami

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 
    ... 
    ... 
} 

Korzystanie #$ może być jedną z opcji, ale potem nazwisko nie będzie zmienna wiążą, co jest dużym problemem.

Odpowiedz

0

Myślę, że zmienne wiążące nie są interpretowane przez funkcję mapy. Są interpretowane przez interpolator Slick sql. Dlatego Twój sql2 nie otrzyma wartości nazwiska.

Jeśli chcesz komponować instrukcje SQL, być może nie możesz użyć funkcji Zwykły SQL. Czy możesz po prostu zrobić .filter (.name ==== nazwa) .filter ( .col2 === nazwisko)?

+0

Moje zapytanie jest o wiele bardziej skomplikowane niż ten jeden, dlatego używam zwykły SQL. – Feyyaz

+0

Założono, że 'sql2' jest częściową kwerendą, która nie jest teraz możliwa w trybie gładkim. Jeśli masz na myśli 'maybeSurname.map', to dla' Option', a nie dla zmiennej bind. – Feyyaz

4

tutaj jest badanie próbki na śliskim 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) 
     } 
     }) 
    } 
    } 
} 

a następnie

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