【问题标题】:Is it possible to define dynamic projections in Slick?是否可以在 Slick 中定义动态投影?
【发布时间】:2014-12-02 07:54:01
【问题描述】:

我有一个连接许多表的查询。我希望能够参数化应该检索哪些字段(有时是复杂的 SQL Postgis 函数)。假设初始查询是这样构建的:

def buildQuery() = for {
  c <- coffees if c.price > 9.0
  s <- c.supplier
} yield (c.name, s.name)

现在我希望生成的值之一取决于我的参数,因此示例将变为:

val param = true
def buildQuery() = for {
  c <- coffees if c.price > 9.0
  s <- c.supplier
} yield (c.name, if (param) s.name else null)

这样的代码不起作用,Slick 内部会抛出 NullPointerException。 有没有合理的方法可以根据输入参数动态构建yield部分?

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    据我所知,您可以使用 slick 的“case dsl”:https://github.com/slick/slick/blob/master/src/main/scala/scala/slick/lifted/Case.scala

    【讨论】:

    • 看起来我们不能用这个 DSL 真正实现“空”元素。此外,它适用于Column[],但不适用于表格,例如在本例中:yield (c.name, s),条件为s
    • 你可以使用'... else LiteralNode("null")'来实现“null”
    • 你是对的,在 2.1 中。从... def Then(res: Column[T])... 开始,这仅限于使用Column 类型(请参阅:github.com/slick/slick/blob/2.1/src/main/scala/scala/s/lifted/…)。另一方面,Slick master 将类型限制为 Rep(参见:github.com/slick/slick/blob/master/src/main/scala/scala/slick/…),这是 Column 和(!)Table 的基本类型。应该可以在 s 上使用条件,并在 slick master 中应用更改。
    • 我试图在 Slick Activator 中应用这个(依赖更新到 2.2.0-SNAPSHOT),但是这个代码:val cond: Boolean = true; val joinQuery = for { c &lt;- coffees if c.price &gt; 9.0; s &lt;- c.supplier } yield (c.name, Case If cond Then s.name Else LiteralNode("null")) 给出了很多编译错误。
    • 尝试类似if (param) s.name.? else null.? 但使用 Slick's Case DSL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2011-09-05
    • 1970-01-01
    • 2011-08-15
    • 2011-04-06
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多