2014-12-02 64 views
4

我有一個連接很多表的查詢。我希望能夠參數化應該檢索哪些字段(有時是複雜的SQL Postgis函數)。假設初始查詢是建立這樣的:是否可以在Slick中定義動態投影?

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部分?

回答

0

據我所知,你可以使用華而不實的「案例DSL」:https://github.com/slick/slick/blob/master/src/main/scala/scala/slick/lifted/Case.scala

+0

看起來我們無法真正實現這種DSL的「空」元素。此外,它適用於'Column []',但不適用於表格,比如在這種情況下:'yield(c.name,s)'具有's'的條件。 – kciesielski 2014-12-02 11:59:28

+0

你可以實現「null」使用'... else LiteralNode(「null」)' – tfh 2014-12-02 12:41:22

+0

你是對的,在2.1。這僅限於使用一種類型的'Column'作爲'... def然後(res:Column [T])...'(參見:https://github.com/slick/slick/blob/2.1/的src /主/階/階/ S /擡起/ Case.scala)另一方面,光滑的主人將類型限制爲「Rep」(請參閱​​:https://github.com/slick/slick/blob/master/src/main/scala/scala/slick/lifted/Case.scala)基本類型'Column'和(!)'Table'。應該可以在's'上使用一個條件,並在光滑母版中應用更改。 – tfh 2014-12-02 12:48:12

相關問題