【问题标题】:Multiple left joins using slick?使用光滑的多个左连接?
【发布时间】:2018-10-11 11:00:48
【问题描述】:

我有以下精巧的实体:

class Person(personId, houseId, carId)
class House(houseId)
class Car(carId)

我想选择一个人及其可选的房子和汽车,我的查询是:

val query = personTable
      .filter(_.personId === personId)
      .joinLeft(houseTable)
      .on(_.houseId === _.houseId)
      .joinLeft(carTable)
      .on(_._1.carId === _.carId)
      .result
      .headOption

但是,查询的返回类型看起来有点滑稽,我希望它是一个元组(人、房子、汽车):

Option[(Person, Option[House], Option[Car])]

但它实际上是一个元组(tuple(person, house), car):

Option[((Person, Option[House]), Option[Car])]

返回的数据似乎是正确的,只是结构不寻常,也许我没有正确执行上面的多重连接?

【问题讨论】:

  • 也许如果您尝试在理解范围内重写它(查看applicative join 中的示例),您将能够更改查询的格式以返回单个元组。由于 for-comprehensions 只是很好的语法糖,map 可能也可以完成这项工作

标签: scala slick slick-3.0


【解决方案1】:

在我看来一切正常。

如果您不喜欢当前的数据类型,您可以在查询中map 进行更改,例如:

val query = personTable
      .filter(_.personId === personId)
      .joinLeft(houseTable)
      .on(_.houseId === _.houseId)
      .joinLeft(carTable)
      .on(_._1.carId === _.carId)
      .map{case((person, houseOpt), carOpt) => (person, houseOpt, carOpt)}
      .result
      .headOption

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 2017-04-23
    • 1970-01-01
    • 2013-12-21
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多