Frage

Der Titel ist selbsterklärend.Mit 2.0.0-M3 möchte ich vermeiden, dass unnötige Ausführlichkeit die Form der expliziten Benennung der zu verbindenden Spalten ist, da sie entsprechend benannt sind und seitdem NATURAL JOIN ist Teil des SQL-Standards.Ganz zu schweigen davon, dass Wikipedia selbst das sogar sagt "Der natürliche Join ist wohl einer der wichtigsten Operatoren, da er das relationale Gegenstück zum logischen UND ist."

Ich denke, das Vorstehende sollte klar genug sein, aber wenn nicht, lesen Sie weiter.Angenommen, ich möchte den Lieferantennamen und die Teilenummer jedes Teils wissen.Unter der Annahme geeigneter, nicht gezeigter Fallklassen:

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]

Vorausgesetzt, beide Tabellen haben die snum spalte, an der ich teilnehmen möchte, scheint als ob

( suppliers join shipments ).run

sollte einen Vektor mit meinen gewünschten Daten zurückgeben, aber ich bekomme einen fehlgeschlagenen Versuch eines INNER JOIN, schlägt fehl (zur Laufzeit), da eine Join-Bedingung fehlt.

Ich weiß, dass ich tun kann

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

aber auch ohne die Namen aller Spalten, die ich aus Gründen der Klarheit dieser Frage weggelassen habe, ist es immer noch viel mehr Tippen (und Korrekturlesen) als einfach

suppliers join shipments

oder für diese Angelegenheit

SELECT * FROM suppliers NATURAL JOIN shipments;

Wenn der Scala-Code chaotischer ist als der SQL-Code, dann fange ich wirklich an, Dinge in Frage zu stellen.Gibt es keine Möglichkeit, einfach einen natürlichen Join in Slick zu machen?

War es hilfreich?

Lösung

Derzeit nicht von Slick unterstützt.Bitte reichen Sie ein Ticket oder eine Pull-Anfrage ein.

Um die Lesbarkeit des Abfragecodes zu verbessern, können Sie Ihre Join-Bedingungen in wiederverwendbare Werte umwandeln.Oder Sie können den gesamten Join in eine Funktions- oder Methodenerweiterung der Abfrage [Lieferanten, Lieferant] einfügen.

Alternativ können Sie sich das hier beschriebene AutoJoin-Muster ansehen (das Ihre Join-Bedingungen im Grunde implizit macht) http://slick.typesafe.com/docs/#20130612_slick_vs_orm_scaladays_2013 und hier umgesetzt https://github.com/cvogt/play-slick/blob/scaladays2013/samples/computer-database/app/util/autojoin.scala

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top