Scala Slick 3.1多重连接

9

我正在尝试在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

我尝试过以下方法:
val query = for {
  c <- Customer
  ca <- CustomerAddress if ca.customerId === c.id
  a <- Address if a.id === ca.addressId
} yield (c, a)

这里的问题在于如果客户没有地址,那么它不会出现,这是有道理的。

然后我尝试了这个:

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

这里的问题在于,当我使用_._2作为Rep对象时,在_._2.addressId上出现了错误。
具体错误信息:
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)

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

我如何使用Slick获得我想要的结果?


请您加上您所收到的错误信息? - Liza Shakury
3个回答

7
你需要做的是将结果映射出来。
val query2 = for {
      ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.map(_.addressId) === _.id)
} yield (c, a)

这是正确的答案,但这个语法令人作呕。我原以为Slick能为我解决问题,但我只是遇到了像这样的挫折。 - mister-f
Slick中是否引入了更简洁的方法来解决这个问题?这是相当常见的用例(至少对我们来说),这使得代码变得非常丑陋! - Vishal Shukla

3

这个答案和其他答案一样,但更加清晰易读。

val query2 = for {
    ((customer, customerAddress), address) <-
        (Customer joinLeft CustomerAddress on
            {
                case(customerTable,customerAddressTable) =>
                    (customerTable.id === customerAddressTable.customerId)
            }
        ) joinLeft Address on
            {
                case ((customerTable,customerAddressTable),addressTable) =>
                    (customerAddressTable.map(_.addressId) === addressTable.id)
            }
} yield (customer, address)

2
这应该可以正常运行。使用((c, ca), a)而不是(c, ca, a)
val query2 = for {
   ((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.addressId === _.id)
} yield (c, a)

@JellevanEs 看起来 Table 的配置有误。是否可以分享 CustomerCustomerAddressAddress 的定义?看起来你在其中一个表的定义中没有使用 Option - TheKojuEffect
我添加了Table类。我不知道你能否对其进行操作,因为它是由Slick自动生成的。 - Jelle van Es

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接