2016-04-05 6 views
6

Я пытаюсь выполнить несколько соединений в Slick 3.1.1. Результат, который я хотел бы достичь такой:Scala Slick 3.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) 

Auto генерироваться Slick класс Таблицы: http://pastebin.com/e4M3cGU8

Как я могу получить результаты, которые я хочу с Slick?

+0

Не можете добавить ошибку в свои уведомления? –

ответ

3

То, что вы должны сделать, это также сопоставить результаты.

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

, это правильный ответ, но этот синтаксис является отвратительным. я думал, что пятно решит проблемы для меня, но я только что встретился с такими разочарованиями, как это –

1

Это должно сработать. // ((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) 
+0

Я пробовал, но он по-прежнему дает ту же ошибку –

+0

@JellevanEs Похоже, что конфигурация для 'Table' неверна. Можно ли было бы использовать определение «Customer», «CustomerAddress» и «Address»? Похоже, вы пропустили использование опции «Option» в одном из этих определений таблицы? – TheKojuEffect

+0

Я добавил класс Table. Я не знаю, можете ли вы что-то сделать с ним, потому что он сгенерирован автоматически с помощью slick –

Смежные вопросы