Pregunta

El título se explica por sí mismo.Al usar 2.0.0-M3, me gustaría evitar la verbosidad innecesaria en la forma de nombrar explícitamente las columnas que se unirán, ya que tienen nombres apropiados y dado que NATURAL JOIN es parte del estándar SQL.Sin mencionar que la propia Wikipedia incluso dice que "La unión natural es posiblemente uno de los operadores más importantes, ya que es la contraparte relacional del AND lógico".

Creo que lo anterior debería quedar bastante claro, pero si no es así, sigue leyendo.Supongamos que quiero saber el nombre del proveedor y el número de pieza de cada pieza.Suponiendo que no se muestran las clases de casos apropiadas:

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]

Dado que ambas tablas tienen la snum columna a la que quiero unirme, parece como si

( suppliers join shipments ).run

Debería devolver un Vector con los datos deseados, pero recibo un intento fallido de realizar un INNER JOIN, fallando (en tiempo de ejecución) ya que falta alguna condición de unión.

sé que puedo hacer

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

pero, incluso sin los nombres de todas las columnas que omití para aclarar esta pregunta, sigue siendo mucho más mecanografiar (y corregir) que simplemente

suppliers join shipments

o, para el caso

SELECT * FROM suppliers NATURAL JOIN shipments;

Si el código Scala es más complicado que el código SQL, entonces realmente empiezo a cuestionar las cosas.¿No hay forma sencilla de realizar una unión natural en Slick?

¿Fue útil?

Solución

actualmente no es compatible con Slick.Por favor envíe un boleto o solicitud de tracción.

Para mejorar la legibilidad del código de consulta, puede poner sus condiciones de unión en valores reutilizables.O puede colocar toda la única unirse en una función o extensión de método de consulta [proveedores, proveedor].

Alternativamente, podría ver el patrón de autojustain (que básicamente hace que sus condiciones de unión implícita) se describen aquí HTTP://slick.typesafe.com/docs/#20130612_slick_vs_orm_scaladays_2013 e implementado aquí https://github.com/cvogt/play-slick/blob/caladays2013/samples/computer-database/app/util/autojoin.scala

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top