我正试图通过光滑的表格获得结果。
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 ;
如果您的表只包含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)
}
如果您告诉我您想要达到的目标,我可以为您提出另一种解决方案。