加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Slick 3多个外连接

发布时间:2020-12-16 09:01:40 所属栏目:安全 来源:网络整理
导读:从Slick文档中,很清楚如何在两个表之间进行单个左连接. val q = for { (t,v) - titles joinLeft volumes on (_.uid === _.titleUid)} yield (t,v) 如预期的,查询q将具有属性:_1类型为“标题”,_2类型为Rep [Option [Volumes]]以覆盖未存在的卷. 进一步级联
从Slick文档中,很清楚如何在两个表之间进行单个左连接.

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

如预期的,查询q将具有属性:_1类型为“标题”,_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

解决方法

您的第二个左连接不再在TableQuery [标题]上操作,而是在有效的Query [(标题,选项[卷])]上(忽略结果和集合类型参数).当您在TableQuery [Chapters]中加入结果查询时,您可以使用_2字段访问元组中的第二个条目(因为它是您需要映射以访问uid字段的选项):

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

避免元组N

如果_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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读