@xtccc
2017-03-03T00:29:47.000000Z
字数 1804
阅读 2567
Database
目录
假设我们有一个Set,希望在SQL中针对这个Set使用in,该怎么办呢?直接使用的话,会有问题,我们需要自己做些额外的工作。
import scala.slick.jdbc.SetParameterimport scala.slick.session.PositionedParametersimport scala.slick.jdbc.StaticQuery.interpolationimport scala.slick.session.Database.threadLocalSessionimplicit 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 BatchProgressset batch_status = $newStatuswhere 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.GetResultimport scala.slick.session.PositionedResultobject ResultMap extends GetResult[Map[String, String]] {def apply(pr: PositionedResult): Map[String, String] = {val rs = pr.rsval md = rs.getMetaDataval res = (1 to pr.numColumns).map { i =>md.getColumnName(i) -> {val value = rs.getObject(i)if (value == null) "" // null的value输出空串代替else value.toString}}.toMappr.nextRowres}}db withSession {val result: List[Map[String, String]] = sql"select * from BatchProgress where ".as(ResultMap).list// 现在,results里面的每一个元素,就代表表中的一行(包含了全部columns的列名与值)。}
