2013-06-20 63 views
0

我在尋找的東西看起來很常見,但我似乎無法通過Squeryl API找到它。我需要在我的聲明中加入一個條件片段。Squeryl動態連接子句

def getAllJoined(
    hasFallback:Option[String] = None 
):List[(Type1,Type2)] = transaction{ 
    join(mainTable, 
    table2, 
    table3, 
    table3, 
    table4.leftOuter, 
    table4.leftOuter, 
    table5, 
    table6)((main, attr1, attr2, attr3, attr4, attr5, attr6, attr7) => 
    select(main,attr1,attr2,attr3,attr4,attr5,attr6,attr7) 
    on(
     //if(hasFallback.isDefined) (main.fallBack).isNotNull else 1 === 1.inhibitWhen(true) 
     (main.attr1Col === attr1.id) , 
     (main.attr2Col === attr2.id) , 
     (main.attr3Col === attr3.id) , 
     (main.attr4Col === attr4.map(_.id)) , 
     (main.attr5Col === attr5.map(_.id)) , 
     (main.attr6Col === attr6.id) , 
     (main.attr7Col === attr7.id) 
    ) 
).toList 

我不知道我怎麼能得到這個。我曾考慮過諸如在另一個地方加入,或者做了我在這裏評論的內容。

底線基本上是如果我有這個hasFallback標誌上,我只需要返回此列不爲空(定義)的對象。否則,如果hasFallback標誌不存在,則忽略它是否已定義。

編輯:它看起來像on方法只能採取七個參數。有沒有解決這七個參數限制的方法?

另外,type mismatch; found : org.squeryl.dsl.boilerplate.JoinQueryYield6[myTuple] required: org.squeryl.dsl.boilerplate.JoinQueryYield7[?] 因此,顯然我無論如何都被迫有7個理由嗎?沒有更多或更少。

直接從squeryl站點

如果連接具有N個參數,在「接通」功能必須採取N-1自變量, 第i個「導通」狀態對應於第i個表表情:

join(T, A1, A2,... AN)((a1,a2,...,aN) => 
    ... 
    on(...condition for a1...,...condition for a2...,......condition for aN...,) 
) 

SOLUTION:對於任何其他人同樣的問題在這裏登陸,這裏是使用WHERE子句的解決方案。

...table6)((main, attr1, attr2, attr3, attr4, attr5, attr6, attr7) => 
where(
    main.fallBack.isNotNull.inhibitWhen(!hasFallback.isDefined) 
    ) 
    select(main,attr1,attr2,attr3,attr4,attr5,attr6,attr7)... 

回答

1

如果你只是希望有條件添加到您的where子句,你可以做這樣的事情:

on(
    t1.secondary === t2.id and 
    (if(hasFallback.isDefined) t1.fallback.isNotNull else 1 === 1.inhibitWhen(true)) 
) 

inhibitWhen條款應始終無法顯示在實際的SQL向上的1 === 1輸出,但它可以讓你的if/else至RET urn a LogicalBoolean

+0

我會測試這個,但顯然'上'只能採取7個參數......有沒有辦法解決這個問題? – kingdamian42

+0

嗯,我不確定。錯誤是你不能加入超過7個表,或者任何兩個表只能加入不超過7個'LogicalBoolean'條件?此外,是否源自數據庫?如果是後者,我認爲你可以將這些條件中的一些移到WHERE條款。 – jcern

+0

這是一個squeryl問題。我最終將條件添加到where子句中,並且似乎正在工作。謝謝! – kingdamian42

0

有相關GitHub上一個類似的問題和谷歌組談話:

https://github.com/max-l/Squeryl/pull/168

https://github.com/max-l/Squeryl/pull/144

https://groups.google.com/forum/#!topic/squeryl/BBAXbtRq9v4

如果您使用squeryl-0.9 .5-6,那麼你應該找到你自己的出路。我選擇了做(類似的任務)的方式如下:

/** thin wrappwer with no runtime cost */ 
    implicit class RichLogicalBoolean(val e: LogicalBoolean) extends AnyVal { 
     def and(condition: Boolean, other: LogicalBoolean) = if (condition) other and e else e 
    } 

在此之後,我可以編寫代碼:

t1.secondary === t2.id and 
    (yourCondition, t1.fallback.isNotNull)