Scala 光滑3多个外部连接
从流畅的文档中,可以清楚地看到如何在两个表之间进行单个左连接Scala 光滑3多个外部连接,scala,playframework-2.0,slick,Scala,Playframework 2.0,Slick,从流畅的文档中,可以清楚地看到如何在两个表之间进行单个左连接 val q = for { (t, v) <- titles joinLeft volumes on (_.uid === _.titleUid) } yield (t, v) 如果\uu.uid不存在,则这将不起作用,因为\uu.uid===\uu.volumeUid无效 根据网络上的各种消息来源,这不应该是一个问题,但话说回来,消息来源倾向于针对不同的光滑版本,3.0仍然是相当新的。有人对这个问题有什么线索吗? 为了澄
val q = for {
(t, v) <- titles joinLeft volumes on (_.uid === _.titleUid)
} yield (t, v)
如果\uu.uid
不存在,则这将不起作用,因为\uu.uid===\uu.volumeUid
无效
根据网络上的各种消息来源,这不应该是一个问题,但话说回来,消息来源倾向于针对不同的光滑版本,3.0仍然是相当新的。有人对这个问题有什么线索吗?
为了澄清这一点,我们的想法是使用两个左连接从3个级联的1:n:n表中提取数据。
等效的SQL是:
Select *
from titles
left join volumes
on titles.uid = volumes.title_uid
left join chapters
on volumes.uid = chapters.volume_uid
您的第二个左联接不再在
TableQuery[Titles]
上运行,而是在有效的查询[(Titles,Option[Volumes])]
上运行(忽略结果和集合类型参数)。当您在表格查询[章节]
上加入结果查询时,您可以使用\u 2
字段访问元组中的第二个条目(因为它是选项
您需要映射
才能访问uid
字段):
这个答案可能与Slick 2Hi Sean的答案相同-我更正了我的问题代码并添加了2.uid。这实际上是一个问题,因为在表达式:joinLeft chapters on(.\u 2.uid===.\u.volumeUid).\u 2不是卷的类型,而是Rep[Option[Volumes]]的类型。因此u._2.uid不可用,这是问题的根源。@Bruno-更新了我认为正确的3.0I语法,并将答案标记为正确,因为它确实可以编译。然而,不幸的是,我无法完全测试它,因为我目前在slick中面临其他问题。谢谢如果将所有的
joinLeft
s放在一行中,它就会编译。至少对我来说。
Select *
from titles
left join volumes
on titles.uid = volumes.title_uid
left join chapters
on volumes.uid = chapters.volume_uid
val q = for {
((t, v), c) <- titles
joinLeft volumes on (_.uid === _.titleUid)
joinLeft chapters on (_._2.map(_.uid) === _.volumeUid)
} yield /* etc. */
// The `Table` variant of the joined row representation
case class TitlesAndVolumesRow(title: Titles, volumes: Volumes)
// The DTO variant of the joined row representation
case class TitleAndVolumeRow(title: Title, volumes: Volume)
implicit object TitleAndVolumeShape
extends CaseClassShape(TitlesAndVolumesRow.tupled, TitleAndVolumeRow.tupled)