Scala + Slick - 获取GroupBy结果的计数

时间:2013-11-18 09:53:28

标签: scala slick

我正在尝试使用我的Scala + Slick代码上的groupBy从数据库中获取计数。

这是我的部分代码:

object DBJobs extends Table[DBJob]("encoder_job") {
  object Status extends Enumeration {
    val local = Value("LOCAL")
    val encoding = Value("ENCODING")
    val done = Value("DONE")
    val error = Value("ERROR")
  }
  implicit val StatusMapper = MappedTypeMapper.base[Status.Value, String] (
    {x => x.toString},
    {x => x match {case "LOCAL"=>Status(0);case "ENCODING"=>Status(1);case "DONE"=>Status(2);case "ERROR"=>Status(3)}}
  )

  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def status = column[DBJobs.Status.Value]("status", O.NotNull)

  def getStats()(implicit session:Session):mutable.Map[Status.Value, Int] = {
    var map = mutable.Map[Column[Status.Value], Column[Int]]()
    val q = (for { j <- DBJobs } yield (j)).groupBy(_.status).map{
      case (s, results) =>
        map = map += (s -> results.length)
    }
    map
  }
}

我的问题是如何将数据放在我的地图中 [DBJobs.Status,Int] 而不是 [Column [Status.Value],Column [Int]]

这是SQL等价物:

SELECT COUNT( 1 ), status FROM encoder_job GROUP BY STATUS 

光滑版本:1.0.1

由于

1 个答案:

答案 0 :(得分:7)

def getStats()(implicit session:Session):mutable.Map[Status.Value, Int] = {
  Query(DBJobs).groupBy(_.status).map{
    case (s, results) => (s -> results.length)
  }
}

// usage
val results = getStats.run

请注意,直接在表对象中放置方法无法轻松迁移到Slick 2.0。将它们分开,例如作为方法扩展。另请参阅https://groups.google.com/d/msg/scalaquery/xNtPT6sexXI/zlkgxv6lZ6YJ