我正在努力为查询添加其他条件。在最简单的形式中,我需要的是下面的内容:
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 :(得分:6)
这是一个关于光滑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
答案 1 :(得分:0)
我认为绑定变量不是由map函数解释的。它们由Slick sql插值器解释。这就是为什么你的sql2不会获得姓氏值的原因。
如果需要编写SQL语句,也许可以考虑不使用Plain SQL功能。你可以做.filter( .name ==== name).filter( .col2 === surname)?