Могу ли я сделать NATURAL JOIN is Slick v2?

Название говорит само за себя. Используя 2.0.0-M3, я хотел бы избежать ненужной многословности — это форма явного именования столбцов, которые должны быть объединены, поскольку они имеют соответствующие имена и поскольку NATURAL JOIN является частью стандарта SQL. Не говоря уже о том, что в самой Википедии даже говорится, что "Естественное соединение, возможно, является одним из самых важных операторов, поскольку оно является реляционным аналогом логического И."

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

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?


person Adam Mackler    schedule 18.11.2013    source источник


Ответы (1)


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

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

В качестве альтернативы вы можете посмотреть на шаблон 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

person cvogt    schedule 18.11.2013