使用光滑的多个左联接?

时间:2018-10-11 11:00:49

标签: scala slick slick-3.0

我有以下光滑实体:

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

但这实际上是一个元组(元组(人,房子,汽车):

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

返回的数据看起来确实正确,只是结构不同寻常,也许我在上面没有正确执行多个联接?

1 个答案:

答案 0 :(得分:2)

对我来说,事情看起来很正常。

如果您不喜欢当前数据类型,则可以在查询中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