@xtccc
2017-03-03T08:29:47.000000Z
字数 1804
阅读 2289
Database
目录
假设我们有一个Set,希望在SQL中针对这个Set使用in
,该怎么办呢?直接使用的话,会有问题,我们需要自己做些额外的工作。
import scala.slick.jdbc.SetParameter
import scala.slick.session.PositionedParameters
import scala.slick.jdbc.StaticQuery.interpolation
import scala.slick.session.Database.threadLocalSession
implicit object SetSetString extends SetParameter[Set[String]] {
def apply(vSet: Set[String], pp: PositionedParameters) {
vSet.foreach(pp.setString)
}
}
def UpdateBatchStatusInDb(batchSerialSet: Set[String], newStatus: String) {
SlickTypes2.ouptputDB withSession {
sqlu""" update BatchProgress
set batch_status = $newStatus
where batch_serial in ($batchSerialSet#${",?" * (batchSerialSet.size - 1)})
""".execute()
}
}
如果通过Slick的Plain Query来查询一张表的部分字段时,往往会将这些字段转成一个tuple后输出,例如:
db withSession {
val results =
sql""" select batch_serial, batch_status from BatchProgress """.as[(String, String)].toMap
}
这里就是将欲查询的两个columns转换成了tuple。
Scala里面的tuple最多可以包含22个字段,但是如果要查询的columns超过了22个呢?
可以自定义tuple,使得它可以包含更多的字段;也可以将查询出的字段转换成class后输出,但这样要求我们事先确定每个column的名称。
下面介绍一个方法,它将查询的columns以Map[column name, column value]的形式输出。
import scala.slick.jdbc.GetResult
import scala.slick.session.PositionedResult
object ResultMap extends GetResult[Map[String, String]] {
def apply(pr: PositionedResult): Map[String, String] = {
val rs = pr.rs
val md = rs.getMetaData
val res = (1 to pr.numColumns).map { i =>
md.getColumnName(i) -> {
val value = rs.getObject(i)
if (value == null) "" // null的value输出空串代替
else value.toString
}
}.toMap
pr.nextRow
res
}
}
db withSession {
val result: List[Map[String, String]] = sql"select * from BatchProgress where ".as(ResultMap).list
// 现在,results里面的每一个元素,就代表表中的一行(包含了全部columns的列名与值)。
}