在Slick中分组

时间:2017-05-25 11:13:38

标签: scala slick

我正试图通过光滑的表格获得结果。

Sql : Select * from Jobs GROUP BY category ;

班级

case class JobEntity(id:Option[Long],category:String,properties:String)

我的光滑功能

def getJobsByCategory() :(String,Future[Seq[JobsEntity]]) = 
db.run(jobs.groupBy(_.category).map{ case(category,res) => 
(category,res)}.result)

错误:

No matching Shape found.
[ERROR] Slick does not know how to map the given types.
[ERROR] Possible causes: T in Table[T] does not match your * projection,
[ERROR]  you use an unsupported type in a Query (e.g. scala List),
[ERROR]  or you forgot to import a driver api into scope.
[ERROR]   Required level: slick.lifted.FlatShapeLevel
[ERROR]      Source type: (slick.lifted.Rep[String], slick.sql.FixedSqlStreamingAction[Seq[org.exadatum.xstream.persistence.models.SparkConfigEntity],org.exadatum.xstream.persistence.models.SparkConfigEntity,slick.dbio.Effect.Read])
[ERROR]    Unpacked type: T
[ERROR]      Packed type: G
[ERROR] 

返回类型可能存在一些问题,但我不确定是什么 因为IDE生成错误

Expression of type Future[Seq[Nothing]] doesn't conform to expected type (String,Future[Seq[JobsEntity]])

1 个答案:

答案 0 :(得分:0)

Sql : Select * from Jobs GROUP BY category ;

如果您的表只包含category字段,则此查询仅适用于(即使在SQL中)。

使用group by语句select语句中的每个字段都不在group by语句中(在你的情况下除了类别之外的所有内容(*))需要以某种方式聚合,因为标准SQL只支持flat result表。

同样代表Slick。在groupBy调用之后的地图调用中,您必须为您的类别之外的所有内容定义聚合函数。否则Slick不知道如何映射结果(如异常中所述)

case class JobEntity(id:Option[Long],category:String,properties:String)

db.run(jobs.groupBy(_.category).map{ case(category,res) =>(category,res)}.result)

不能正常工作。

类似的东西:

db.run(jobs.groupBy(_.category).map{ case(category,res) =>(category,res.map(_.1).sum)}.result)

可行,因为它会导致扁平形状:您的类别以及具有该类别的ID的总和。我知道这对你来说没有意义,但希望能说明问题。

如果真的只想根据类别对作业进行分组,我会在从数据库中获取作业后在Scala中进行:

val groupedJobs: Future[Seq[String, JobEntity]] = db.run(jobs).map {
   case jobs => jobs.groupBy(_.category)
}

如果您告诉我您想要达到的目标,我可以为您提出另一种解决方案。