我正在努力为我的查询添加其他条件.在最简单的形式,我需要的是如下所示:
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
...
...
}
Run Code Online (Sandbox Code Playgroud)
使用#$可能是一个选项,但是surname不会是绑定变量,这是一个大问题.
小智 7
这是一个关于光滑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)
}
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后
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
Run Code Online (Sandbox Code Playgroud)
我认为绑定变量不是由映射函数解释的。它们由 Slick sql 插值器解释。这就是为什么你的 sql2 将无法获得姓氏值。
如果您需要编写SQL语句,也许您可以考虑不使用Plain SQL功能。你可以只做 .filter( .name ==== name ).filter( .col2 === surname) 吗?
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |