我正在寻找的东西似乎相当普遍,但我似乎无法通过 Squeryl api 弄清楚。我需要在我的 on 语句中有一个条件片段才能加入。
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 个参数,'on' 函数必须有 N-1 个参数,第 i 个 'on' 条件对应于第 i 个表表达式:
join(T, A1, A2,... AN)((a1,a2,...,aN) =>
...
on(...condition for a1...,...condition for a2...,......condition for aN..., )
)
解决方案:对于遇到同样问题的其他人,这里是使用 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)...