标题不言自明。使用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中进行自然连接吗?
答案 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