Slick v2可以进行自然连接吗?

时间:2013-11-18 05:51:59

标签: sql scala join slick relational-algebra

标题不言自明。使用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."

我认为上述内容应该足够清楚,但如果没有,请继续阅读。假设我想知道每个部件的供应商名称和部件号。假设没有显示适当的案例类:

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

应该使用我想要的数据返回一个Vector,但是我在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 个答案:

答案 0 :(得分: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