2017-05-25 46 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