Scala Slick 3.1多个连接

Jel*_* Es 7 scala slick

我正在尝试在Slick 3.1.1中执行多个连接.我想要实现的结果是:

SELECT * FROM customer LEFT JOIN customer_address ON customer.id = customer_address.customer_id LEFT JOIN address ON customer_address.address_id = address.id
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

val query = for {
  c <- Customer
  ca <- CustomerAddress if ca.customerId === c.id
  a <- Address if a.id === ca.addressId
} yield (c, a)
Run Code Online (Sandbox Code Playgroud)

这里的问题是,如果客户没有一个看起来没有意义的地址.

然后我尝试了这个:

    val query2 = for {
       (c, ca, a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id)
    } yield (c, a)
Run Code Online (Sandbox Code Playgroud)

这里的问题是我得到一个错误_._2.addressId因为_._2是一个Rep对象.

确切的错误:

Error:(21, 110) value addressId is not a member of slick.lifted.Rep[Option[Models.Tables.CustomerAddress]]
  (c, ca, a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id)
Run Code Online (Sandbox Code Playgroud)

自动生成的Slick Tables类:http: //pastebin.com/e4M3cGU8

如何通过Slick获得我想要的结果?

小智 6

您还需要映射结果。

val query2 = for {
      ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.map(_.addressId) === _.id)
} yield (c, a)
Run Code Online (Sandbox Code Playgroud)