【发布时间】:2014-06-01 04:00:01
【问题描述】:
我开始使用 Slick,但我不知道如何将查询结果映射到我的自定义案例类上。 这是我的代码:
package main.scala.model.Tree
import scala.slick.driver.H2Driver.simple._
case class SlickNode(id : Long, parentId : Long, stateString : String)
extends AbstractNode{}
object SlickNode {
val nodes = TableQuery[SlickNodes]
def findById(x : Long) : SlickNode = nodes.filter(_.id == x).first
def findByParentId(x : Long) : Iterable[SlickNode] = nodes.filter(_.parentId == x).list
}
class SlickNodes(tag: Tag) extends Table[(Long, Long, String)](tag, "NODES") {
def id = column[Long]("NODE_ID", O.PrimaryKey, O.AutoInc)
def parentId = column[Long]("PARENT")
def stateString = column[String]("STATE")
def * = (id, parentId, stateString) <> ((SlickNode.apply _).tupled , SlickNode.unapply)
}
我所期望的是从 (Long, Long, String) 到 SlickNode 的自动转换,如 * 定义中所述。 我错过了什么吗? 先感谢您。 亲切的问候
********* 编辑 ********* 我认为问题在我的代码中更深层次。 当我尝试编译它时,我得到了这个错误:
[error] 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. Or you use an unsupported type in a Query (e.g. scala List).
[error] Required level: scala.slick.lifted.ShapeLevel.Flat
[error] Source type: scala.slick.lifted.MappedProjection[main.scala.model.Tree.SlickNode,(Long, Long, String)]
[error] Unpacked type: (Long, Long, String)
[error] Packed type: Any
[error] def * = (id, parentId, stateString) <> ((SlickNode.apply _).tupled , SlickNode.unapply)
[error] ^
【问题讨论】:
-
我认为问题在我的代码中更深层次。当我尝试编译它时,我收到此错误:未找到匹配的形状。 Slick 不知道如何映射给定的类型。可能的原因: Table[T] 中的 T 与您的 * 投影不匹配。或者您在查询中使用不受支持的类型(例如 scala 列表)。所需级别:scala.slick.lifted.ShapeLevel.Flat 源类型:scala.slick.lifted.MappedProjection[main.scala.model.Tree.SlickNode,(Long, Long, String)] 解压类型:(Long, Long, String ) 打包类型:任意 def * = (id, parentId, stateString) ((SlickNode.apply _).tupled , SlickNode.unapply)