scala - 使用光滑的多个左连接?
问题描述
我有以下光滑的实体:
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])]
返回的数据似乎是正确的,它只是在一个不寻常的结构中,也许我没有正确执行上面的多个连接?
解决方案
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
推荐阅读
- python - 为什么有 1 列的 std 而其他的是 nan?
- python - 如何使用 Beautiful Soup 从网站检索信息?
- html - 使 Bootstrap4 卡片宽度拉伸 100%
- python - 如何使用更少的cpu?
- ruby-on-rails - Rails 中 SQLITE 列(数组)的问题
- javascript - 开玩笑 | 断言在 addEventListener 回调中调用了一个函数
- javascript - 与路由器结合使用时的 VueJS 生命周期顺序
- php - 使用 symfony 4 清除现金时失败
- python - 如何在 Python 3 上将数据帧上传到 Google Cloud Storage(bucket)?
- python - 为什么复制字典这么慢?