【问题标题】:Filter using SQL JOIN syntax rather than WHERE in Slick 2.0在 Slick 2.0 中使用 SQL JOIN 语法而不是 WHERE 进行过滤
【发布时间】:2014-02-23 07:34:22
【问题描述】:

Slick 2.0 中是否有一种方法可以在表类上创建一个方法,该方法生成 SQL JOIN 语法而不仅仅是 WHERE 子句?

使用类似于文档的示例:

class Suppliers(tag: Tag) extends Table[(Int, String)](tag, "SUPPLIER") {
    ...
    def suppliedCoffees = coffees.filter(_.supplierId == id)
    def * = (id, name)
}

class Coffees(tag: Tag) extends Table[(Int, Int, String)](tag, "COFFEES") {
    ...
    def * = (id, supplierId, name)
}

我可以创建suppliedCoffees 方法并像这样使用它:

for {
    s <- suppliers
    c <- s.suppliedCoffees
} yield (s.name, c.name) ...

漂亮而整洁 - 易于阅读,并且连接条件被很好地隐藏了。但这会生成一个 SQL WHERE 子句。我怎样才能做类似于以下的事情,但使用像suppliedCoffees 这样的方法,以便将它封装在类中?

for { 
    (s, c) <- suppliers innerJoin coffees on (_.id === _.supplierId)
} yield (s, c) ...

或者更好的是,我如何进行外部联接? (但作为suppliedCoffees之类的方法)

for { 
    (s, c) <- suppliers leftJoin coffees on (_.id === _.supplierId)
} yield (s.name, c.name.?) ...

提前致谢。

干杯, 抢。

附言光滑是真棒!它确实让使用 SQL 数据库再次变得有趣:)

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    您可以使它们成为方法或函数。我们在 Scala Days 2013 和 Scala eXchange 2013 会谈中解释了如何做到这一点。此处提供幻灯片和视频:http://slick.typesafe.com/docs/

    【讨论】:

    • 感谢您的回复。所以我必须使用隐式类?有没有办法让它像我的示例中的suppliedCoffees 方法一样简单(即,只使用filter
    • 这似乎已被破坏。我添加了一个测试用例:https://github.com/slick/slick/pull/689。为什么要 SQL 连接语法而不是 where 语法?
    • 这是一个非常好的问题 :) 这样我就可以进行外部连接,并且我猜想是为了与其他数据库查询保持一致。我假设在内部联接的情况下,它在大多数数据库中的执行与 WHERE 子句相同。 Query(this).join ... 是我所追求的(尽管我可能需要等待),而隐式类方法目前似乎也对我有用。感谢您的帮助!
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2014-09-04
    • 2019-09-27
    相关资源
    最近更新 更多