我有一个连接多个表的查询。我希望能够将应该检索哪些字段参数化(有时是复杂的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部分?
s
的条件yield(c.name,s)
。 - kciesielskiColumn
类型作为... def Then(res: Column[T])...
(参见:https://github.com/slick/slick/blob/2.1/src/main/scala/scala/s/lifted/Case.scala)。另一方面,Slick主分支将类型限制为`Rep`(参见:https://github.com/slick/slick/blob/master/src/main/scala/scala/slick/lifted/Case.scala),它是`Column`和`Table`的基础类型。在slick主分支中应该可以使用`s`上的条件来应用更改。 - tfhval cond: Boolean = true; val joinQuery = for { c <- coffees if c.price > 9.0; s <- c.supplier } yield (c.name, Case If cond Then s.name Else LiteralNode("null"))
会产生相当多的编译错误。 - kciesielskiif (param) s.name.? else null.?
的功能。 - cvogt