2017-05-25 42 views
0

我正在试图从光滑表中得到一个结果组。在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]]) 
+0

你能发表你的表格定义吗?很可能你的*定义不符合你的案例类格式(字段和类型的数量) –

回答

0
Sql : Select * from Jobs GROUP BY category ; 

这个查询只会工作(即使是在SQL),如果你的表只包括类别字段中。

使用group by语句不在group by语句中的select语句中的每个字段(在您的情况中,除类别外的所有(*))需要以某种方式进行汇总,因为标准SQL仅支持flat结果表。

同样代表油滑。在groupBy调用之后的地图调用中,您必须为除类别外的所有内容定义聚合函数。否则油滑不知道如何将结果地图(如例外规定)

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的总和。我知道这对你来说没有任何意义,但希望能够说明问题。

如果真的只是按类别希望将你的工作,我会从数据库中获取他们以后做在斯卡拉:

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

如果你告诉我你想实现什么,我可以建议另一个解决方案。

+0

所以首先我把列命名为我的表中的类别,目的非常简单,因为我需要将基于类别的结果并创建一个JSON。 虽然我还没有尝试与斯卡拉组,但这看起来很有前途。 – Freeman

+0

那它怎么样? – thwiegan