2015-09-30 10 views
6

ich auf Anfügen zusätzliche Bedingungen zu meiner Anfrage bin zu kämpfen. In seiner einfachsten Form, was ich brauche, ist so etwas wie unten:Slick Plain SQL-Abfrage mit Dynamische Bedingungen

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

#$ Mit einer Option sein könnte, aber dann würde Nachnamen kein Bind-Variable sein, die ein großes Problem ist.

Antwort

0

Ich denke, die Bind-Variablen werden nicht durch die Map-Funktion interpretiert. Sie werden vom Slick-Interpolator interpretiert. Deshalb wird Ihr sql2 nicht den Nachnamen erhalten.

Wenn Sie SQL-Anweisungen zu schreiben müssen, vielleicht können Sie berücksichtigen nicht die Funktion Plain SQL. Können Sie gerade tun .filter (.name ==== Name) .filter ( .col2 === Nachname)?

+0

Meine Frage ist viel komplexer als diese, das ist, warum ich Plain SQL bin mit. – Feyyaz

+0

Ich nahm 'sql2' ist eine Teilabfrage, die im Augenblick nicht möglich glatt ist. Wenn Sie 'maybeSurname.map' meine, das ist für' Option', nicht für Bind Variable. – Feyyaz

4

hier ist eine Probe-Test auf glatten 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) 
     } 
     }) 
    } 
    } 
} 

und dann

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