使用光滑的多个左连接?
Multiple left joins using slick?
我有以下光滑的实体:
class Person(personId, houseId, carId)
class House(houseId)
class Car(carId)
我想select一个人和他们自选的房子和车子,我的查询是:
val query = personTable
.filter(_.personId === personId)
.joinLeft(houseTable)
.on(_.houseId === _.houseId)
.joinLeft(carTable)
.on(_._1.carId === _.carId)
.result
.headOption
然而,查询的 return 类型看起来有点滑稽,我希望它是一个元组(人,房子,汽车):
Option[(Person, Option[House], Option[Car])]
但它实际上是一个元组(tuple(person, house), car):
Option[((Person, Option[House]), Option[Car])]
返回的数据看起来确实是正确的,它只是在一个不寻常的结构中,也许我没有正确执行上面的多重连接?
我觉得一切正常。
如果您不喜欢当前的数据类型,您可以在查询中 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
我有以下光滑的实体:
class Person(personId, houseId, carId)
class House(houseId)
class Car(carId)
我想select一个人和他们自选的房子和车子,我的查询是:
val query = personTable
.filter(_.personId === personId)
.joinLeft(houseTable)
.on(_.houseId === _.houseId)
.joinLeft(carTable)
.on(_._1.carId === _.carId)
.result
.headOption
然而,查询的 return 类型看起来有点滑稽,我希望它是一个元组(人,房子,汽车):
Option[(Person, Option[House], Option[Car])]
但它实际上是一个元组(tuple(person, house), car):
Option[((Person, Option[House]), Option[Car])]
返回的数据看起来确实是正确的,它只是在一个不寻常的结构中,也许我没有正确执行上面的多重连接?
我觉得一切正常。
如果您不喜欢当前的数据类型,您可以在查询中 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