【问题标题】:Slick 3 multiple outer joinsSlick 3 多个外部连接
【发布时间】:2015-08-17 23:59:09
【问题描述】:

从 Slick 文档中可以清楚地看到如何在两个表之间建立一个左连接。

val q = for {
  (t, v) <- titles joinLeft volumes on (_.uid === _.titleUid)
} yield (t, v)

正如预期的那样,查询 q 将具有以下属性:_1 类型为 Titles_2 类型为 Rep[Option[Volumes]] 以涵盖不存在的卷。

进一步级联是有问题的:

val q = for {
  ((t, v), c) <- titles 
                     joinLeft volumes on (_.uid === _.titleUid)
                     joinLeft chapters on (_._2.uid === _.volumeUid)
} yield /* etc. */

这不起作用,因为_._2.uid === _.volumeUid 无效,因为_.uid 不存在。

根据网络上的各种来源,这应该不是问题,但话说回来,来源往往针对不同的光滑版本,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

【问题讨论】:

标签: scala playframework-2.0 slick


【解决方案1】:

您的第二个左连接不再在 TableQuery[Titles] 上运行,而是在有效的 Query[(Titles, Option[Volumes])] 上运行(忽略结果和集合类型参数)。当您在TableQuery[Chapters] 上加入生成的查询时,您可以使用_2 字段访问元组中的第二个条目(因为它是Option,您需要map 才能访问uid 字段):

val q = for {
  ((t, v), c) <- titles 
                     joinLeft volumes on (_.uid === _.titleUid)
                     joinLeft chapters on (_._2.map(_.uid) === _.volumeUid)
} yield /* etc. */

避免TupleN

如果_N 字段语法不清楚,您也可以使用Slick's capacity for user-defined record types 来映射您的行:

// 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)

【讨论】:

  • 嗨 Sean - 我更正了有问题的代码并添加了 2.uid。这实际上是问题,因为在表达式中: joinLeft chapters on (._2.uid === _.volumeUid) _._2 不是 Volumes 类型,而是 Rep[Option[Volumes ]]。因此 _._2.uid 不可用,这是问题的根源。
  • @Bruno - 更新了我相信是3.0的正确语法
  • 我将答案标记为正确,因为它确实可以编译。但是,不幸的是,由于我目前面临的其他问题,我无法完全测试它。谢谢!
  • 如果将所有joinLefts 放在一行中,它就会编译。至少对我来说。
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 2021-03-22
  • 2020-08-02
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多