Scala Slick 3.1 多重连接
Scala Slick 3.1 multiple joins
我正在尝试在 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.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)
自动生成 Slick 表格 class:
http://pastebin.com/e4M3cGU8
如何使用 Slick 获得我想要的结果?
这应该有效。 // ((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)
你要做的也是映射结果。
val query2 = for {
((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.map(_.addressId) === _.id)
} yield (c, a)
这个答案也和其他答案一样,但更清晰可读。
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)
我正在尝试在 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.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)
自动生成 Slick 表格 class: http://pastebin.com/e4M3cGU8
如何使用 Slick 获得我想要的结果?
这应该有效。 // ((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)
你要做的也是映射结果。
val query2 = for {
((c, ca), a) <- (Customer joinLeft CustomerAddress on (_.id === _.customerId)) joinLeft Address on (_._2.map(_.addressId) === _.id)
} yield (c, a)
这个答案也和其他答案一样,但更清晰可读。
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)