gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:05:25 25 4
gpt4 key购买 nike

代码如下所示:

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) => (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], scala.slick.lifted.Query[A$A113.this.Suppliers,A$A113.this.Suppliers#TableElementType,Seq]), T, G])scala.slick.lifted.Query[G,T,Seq].
Unspecified value parameter shape.
lazy val gr=suppliers.groupBy(_.city).map{ case (k,v) => (k, v) }.buildColl[Set]
^

但是如果我将 case(k,v)=>(k,v) 更改为 case(k,v)=>(k,v.length) ,它又起作用了。

有人对此有什么想法吗?

最佳答案

原因是:Scala 的 groupBy 返回一个 Map[..., Seq[...]],换句话说,是一个包含其他集合的集合。嵌套集合!但SQL不支持嵌套集合,它总是返回平面表。支持嵌套集合需要比 Slick 目前更复杂的从 Scala 到 SQL 的转换。因此,Slick 禁止这种情况,并要求您将其扁平化。 case(k,v)=>(k,v.length) 就是这样做的,例如,它将类型转换为 Map[..., Int]。 Slick 通过说所需级别:scala.slick.lifted.FlatShapeLevel 来告诉您这一点。

解决方法是在客户端上进行分组,例如suppliers.run.groupBy(_.city) 或在 Slick 2.2 及更高版本中 db.run(suppliers).groupBy(_.city). 如果加入的话可以更有效地运行两个查询并在本地连接它们,而不是传输笛卡尔积并随后进行分组。

关于scala - groupBy 方法在 Slick 中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27477273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com