scala – groupBy方法在Slick中抛出错误

代码如下所示:

case class Supplier(snum: String,sname: String,status: Int,city: String)

class Suppliers(tag: Tag) extends Table[Supplier](tag,"suppliers") {
  def snum  = column[String]("snum")
  def sname = column[String]("sname")
  def status   = column[Int]("status")
  def city     = column[String]("city")
  def * = (snum,sname,status,city) <> (Supplier.tupled,Supplier.unapply _)
}

val suppliers = TableQuery[Suppliers]

val gr=suppliers.groupBy(_.city).map{ case (k,v) => (k,v) }.buildColl[Set]

当我编译它时,它会抱怨:

Error:(69,43) No matching Shape found.
Slick does not know how to map the given types.
Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List).
  Required level: scala.slick.lifted.FlatShapeLevel
     Source type: (scala.slick.lifted.Column[String],scala.slick.lifted.Query[A$A113.this.Suppliers,A$A113.this.Supplier,[+A]Seq[A]])
   Unpacked type: T
     Packed type: G
lazy val gr=suppliers.groupBy(_.city).map{ case (k,v) }.buildColl[Set]
                      ^
Error:(69,43) not enough arguments for method map: (implicit shape: scala.slick.lifted.Shape[_ <: scala.slick.lifted.FlatShapeLevel,(scala.slick.lifted.Column[String],A$A113.this.Suppliers#TableElementType,Seq]),T,G])scala.slick.lifted.Query[G,Seq].
Unspecified value parameter shape.
lazy val gr=suppliers.groupBy(_.city).map{ case (k,v) }.buildColl[Set]
                      ^

但是如果我将case(k,v)=>(k,v)改为case(k,v.length),它再次起作用.

有没有人有这个想法?

解决方法

原因是:Scala的groupBy返回Map […,Seq […]],换言之,包含其他集合的集合.嵌套的集合!但SQL不支持嵌套集合,它总是返回平面表.支持嵌套集合需要比Slick目前更复杂的从Scala到SQL的转换.因此,Slick禁止这种情况,并要求你让它平坦. case(k,v.length)例如,它将类型转换为Map […,Int]. Slick告诉你通过说要求级别:scala.slick.lifted.FlatShapeLevel.

解决方法是在客户端上进行分组,例如suppliers.run.groupBy(_.city)或Slick 2.2及更高版本的db.run(供应商).groupBy(_.city).在连接的情况下,运行两个查询并在本地加入它们可能更有效,而不是转移笛卡尔积并在之后进行分组.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...