2015-09-30 41 views
6

Tôi đang gặp khó khăn trong việc thêm các điều kiện bổ sung vào truy vấn của mình. Ở dạng đơn giản nhất, những gì tôi cần là một cái gì đó như dưới đây:Truy vấn SQL trơn tru trơn tru với điều kiện động

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

Sử dụng #$ có thể là một lựa chọn, nhưng sau đó họ sẽ không có một biến ràng buộc, mà là một vấn đề lớn.

Trả lời

0

Tôi nghĩ rằng các biến liên kết không được diễn giải bởi hàm bản đồ. Chúng được giải thích bởi nội suy Slick sql. Đó là lý do tại sao sql2 của bạn sẽ không nhận được giá trị họ.

Nếu bạn cần soạn các câu lệnh SQL, có lẽ bạn có thể xem xét không sử dụng tính năng SQL thuần túy. Bạn có thể làm .filter (.name ==== name) .filter ( .col2 === họ)?

+0

truy vấn của tôi là phức tạp hơn nhiều so với thế này, đó là lý do tại sao tôi đang sử dụng Plain SQL. – Feyyaz

+0

Tôi giả định 'sql2' là một truy vấn một phần, điều này không thể thực hiện được ngay bây giờ. Nếu bạn có nghĩa là 'maybeSurname.map', đó là cho' Tùy chọn', không phải cho biến liên kết. – Feyyaz

4

đây là một thử nghiệm mẫu trên 3.1.x trơn

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

và sau đó

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 
Các vấn đề liên quan