[关闭]
@xtccc 2017-03-03T08:29:47.000000Z 字数 1804 阅读 2289

Slick

给我写信
GitHub

此处输入图片的描述


Database



目录


1. in clause


假设我们有一个Set,希望在SQL中针对这个Set使用in,该怎么办呢?直接使用的话,会有问题,我们需要自己做些额外的工作。

参考 http://stackoverflow.com/questions/31156613/is-it-possible-to-use-in-clause-in-plain-sql-slick-for-integers

  1. import scala.slick.jdbc.SetParameter
  2. import scala.slick.session.PositionedParameters
  3. import scala.slick.jdbc.StaticQuery.interpolation
  4. import scala.slick.session.Database.threadLocalSession
  5. implicit object SetSetString extends SetParameter[Set[String]] {
  6. def apply(vSet: Set[String], pp: PositionedParameters) {
  7. vSet.foreach(pp.setString)
  8. }
  9. }
  10. def UpdateBatchStatusInDb(batchSerialSet: Set[String], newStatus: String) {
  11. SlickTypes2.ouptputDB withSession {
  12. sqlu""" update BatchProgress
  13. set batch_status = $newStatus
  14. where batch_serial in ($batchSerialSet#${",?" * (batchSerialSet.size - 1)})
  15. """.execute()
  16. }
  17. }




2.查询宽表的全部字段(超过22列)


如果通过Slick的Plain Query来查询一张表的部分字段时,往往会将这些字段转成一个tuple后输出,例如:

  1. db withSession {
  2. val results =
  3. sql""" select batch_serial, batch_status from BatchProgress """.as[(String, String)].toMap
  4. }

这里就是将欲查询的两个columns转换成了tuple。

Scala里面的tuple最多可以包含22个字段,但是如果要查询的columns超过了22个呢?
可以自定义tuple,使得它可以包含更多的字段;也可以将查询出的字段转换成class后输出,但这样要求我们事先确定每个column的名称。

下面介绍一个方法,它将查询的columns以Map[column name, column value]的形式输出。

参考http://stackoverflow.com/questions/20262036/slick-query-multiple-tables-databases-with-getting-column-names

  1. import scala.slick.jdbc.GetResult
  2. import scala.slick.session.PositionedResult
  3. object ResultMap extends GetResult[Map[String, String]] {
  4. def apply(pr: PositionedResult): Map[String, String] = {
  5. val rs = pr.rs
  6. val md = rs.getMetaData
  7. val res = (1 to pr.numColumns).map { i =>
  8. md.getColumnName(i) -> {
  9. val value = rs.getObject(i)
  10. if (value == null) "" // null的value输出空串代替
  11. else value.toString
  12. }
  13. }.toMap
  14. pr.nextRow
  15. res
  16. }
  17. }
  18. db withSession {
  19. val result: List[Map[String, String]] = sql"select * from BatchProgress where ".as(ResultMap).list
  20. // 现在,results里面的每一个元素,就代表表中的一行(包含了全部columns的列名与值)。
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注