2013-11-18 2 views
0

Название не требует пояснений. Использование 2.0.0-M3, я бы хотел избежать ненужной многословности, это форма явного называния столбцов, к которым нужно объединить, поскольку они соответствующим образом названы, а так как NATURAL JOIN является частью стандарта SQL. Не говоря уже о том, что сама Википедия даже говорит, что "The natural join is arguably one of the most important operators since it is the relational counterpart of logical AND."Могу ли я сделать NATURAL JOIN - это Slick v2?

Я думаю, что вышеизложенное должно быть достаточно ясным, но если нет, читайте дальше. Предположим, я хочу знать имя поставщика и его номер для каждой части. Предполагая, что соответствующие классы регистра не показаны:

class Suppliers(tag: Tag) extends Table[Supplier](tag, "suppliers") { 
    def snum = column[String]("snum") 
    def sname = column[String]("sname") 
    def * = (snum, sname) <> (Supplier.tupled, Supplier.unapply _) 
} 

class Shipments(tag: Tag) extends Table[Shipment](tag, "shipments") { 
    def snum = column[String]("snum") 
    def pnum = column[String]("pnum") 
    def * = (snum, pnum) <> (Shipment.tupled, Shipment.unapply _) 
} 

val suppliers = TableQuery[Suppliers] 
val shipments = TableQuery[Shipments] 

Учитывая, что обе таблицы имеют snum столбец, я хочу присоединиться на, кажется, как будто

(suppliers join shipments).run 

должен возвращать вектор с моими нужными данными, но я получить неудачную попытку на INNER JOIN, сбой (во время выполнения), так как отсутствует какое-либо условие соединения.

Я знаю, что могу сделать

suppliers.flatMap(s => shipments filter (sp => sp.snum === s.snum) map (sp => (s.sname, sp.pnum))) 

, но даже без имен всех столбцов я для ясности этого вопроса, он по-прежнему довольно много более типирование (и корректура), чем просто

suppliers join shipments 

или, по этому вопросу

SELECT * FROM suppliers NATURAL JOIN shipments; 

Если код Scala является хаотичным, чем SQL кода, то я действительно начинаю задавать вопросы. Нет ли способа сделать естественное соединение в Slick?

ответ

1

В настоящее время не поддерживается Slick. Пожалуйста, отправьте заявку или запрос на тяну.

Чтобы улучшить читаемость кода запроса, вы можете поместить свои условия соединения в повторно используемые значения. Или вы можете поместить все соединение в расширение функции или метода Query [Поставщики, Поставщики].

В качестве альтернативы вы можете посмотреть на рисунок AutoJoin (который в основном делает ваши условия соединения неявной), описанные здесь http://slick.typesafe.com/docs/#20130612_slick_vs_orm_scaladays_2013 и реализуется здесь https://github.com/cvogt/play-slick/blob/scaladays2013/samples/computer-database/app/util/autojoin.scala