首页 > 解决方案 > 使用光滑的多个左连接?

问题描述

我有以下光滑的实体:

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

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

标签: scalaslickslick-3.0

解决方案


Things look normal to me.

If you don't like the current datatype, you can map in your query to change it, like this e.g:

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

推荐阅读