Scala 光滑型投影
我试图在查询端定义一个类型来映射我的联接,这样我就可以避免返回一个必须手动应用于投影案例类post查询的值元组 考虑到这样的关系:Scala 光滑型投影,scala,slick,Scala,Slick,我试图在查询端定义一个类型来映射我的联接,这样我就可以避免返回一个必须手动应用于投影案例类post查询的值元组 考虑到这样的关系: case class Parent(id: Int, name: String, extra: String) class ParentTable(tag: Tag) extends Table[Parent](tag, "parent") { def id = column[Int]("id", O.PrimaryKey, O.AutoInc) def
case class Parent(id: Int, name: String, extra: String)
class ParentTable(tag: Tag) extends Table[Parent](tag, "parent") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def extra = column[String]("extra")
def * = (id, name, extra) <> (Parent.tupled, Parent.unapply)
}
val parents = TableQuery[ParentTable]
case class Child(id: Int, parentId: Int, name: String, extra: String)
class ChildTable(tag: Tag) extends Table[Child](tag, "child") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def parentId = column[Int]("parent_id")
def parent = foreignKey("parent_fk", parentId, parents)(_.id)
def name = column[String]("name")
def extra = column[String]("extra")
def * = (id, parentId, name, extra) <> (Child.tupled, Child.unapply)
}
val children = TableQuery[ChildTable]
连接和投影看起来像:
val q = for {
c <- children
p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name)
我想在查询端创建一个具有如下形状的类型:
class ChildParentProjection(val id: Rep[Int],
val name: Rep[String],
val parentName[String])
这样我就可以得到一个函数签名,比如:
Query[ChildParentProjection, ChildWithParentName, Seq]
这在slick中可能吗?我真的不明白您为什么要使用类
ChildParentProjection
。
如果在查询上执行result
时要返回Seq[ChildWithParentName]
,则必须将一元联接产生的元组映射到ChildWithParentName
类,如下所示:
val q = for {
c <- children
p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name) <> (ChildWithParentName.tupled,ChildWithParentName.unapply)
val q=for{
c谢谢。我不知道
可以应用于查询级别。生成的MappedProjection
正是我想要完成的,比我想象中需要做的要简单得多,即不需要ChildParentProjection
。不过,还有一个问题:Beforeq
很容易回答在排序中使用,但我似乎无法从
MappedProjection中提取元组或ChildWithParentName`
Query[ChildParentProjection, ChildWithParentName, Seq]
val q = for {
c <- children
p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name) <> (ChildWithParentName.tupled,ChildWithParentName.unapply)