0

我正在寻找的东西似乎相当普遍,但我似乎无法通过 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)...
4

2 回答 2

1

如果您只是想在 where 子句中添加条件,您可以执行以下操作:

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

inhibitWhen子句应始终防止 的输出1 === 1出现在实际 SQL 中,但它允许您的 if/else 返回一个LogicalBoolean.

于 2013-06-21T05:10:41.610 回答
0

在 github 和 google group 上有一个与类似问题相关的演讲:

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)
于 2013-06-20T21:08:43.903 回答