Question

Le titre est explicite.En utilisant 2.0.0-M3, j'aimerais éviter toute verbosité inutile en nommant explicitement les colonnes à joindre, car elles sont nommées de manière appropriée et puisque NATURAL JOIN fait partie du standard SQL.Sans oublier que Wikipédia lui-même dit que "La jointure naturelle est sans doute l'un des opérateurs les plus importants puisqu'elle est la contrepartie relationnelle du ET logique."

Je pense que ce qui précède devrait être assez clair, mais sinon, continuez à lire.Supposons que je veuille connaître le nom du fournisseur et le numéro de pièce de chaque pièce.En supposant que les classes de cas appropriées ne soient pas affichées :

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]

Étant donné que les deux tableaux ont le snum colonne à laquelle je veux me joindre, on dirait que

( suppliers join shipments ).run

devrait renvoyer un vecteur avec les données souhaitées, mais j'obtiens une tentative infructueuse de INNER JOIN, échouant (au moment de l'exécution) car il manque toute condition de jointure.

Je sais que je peux le faire

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

mais, même sans les noms de toutes les colonnes que j'ai omis pour plus de clarté, cela représente encore beaucoup plus de saisie (et de relecture) que de simplement

suppliers join shipments

ou, d'ailleurs

SELECT * FROM suppliers NATURAL JOIN shipments;

Si le code Scala est plus compliqué que le code SQL, alors je commence vraiment à remettre les choses en question.N'y a-t-il aucun moyen de faire simplement une jointure naturelle dans Slick ?

Était-ce utile?

La solution

Actuellement non pris en charge par Slick.Veuillez soumettre un ticket ou une demande de tirage.

Pour améliorer la lisibilité du code de requête, vous pouvez placer vos conditions de jointure dans des valeurs réutilisables.Ou vous pouvez placer l'intégralité de la jointure dans une extension de fonction ou de méthode de Query[Suppliers,Supplier].

Vous pouvez également consulter le modèle AutoJoin (qui rend vos conditions de jointure implicites) décrit ici http://slick.typesafe.com/docs/#20130612_slick_vs_orm_scaladays_2013 et mis en œuvre ici https://github.com/cvogt/play-slick/blob/scaladays2013/samples/computer-database/app/util/autojoin.scala

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top