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 フラグをオンにしている場合、この列が null ではない (定義されている) オブジェクトのみを返す必要があるということです。それ以外の場合、hasFallback フラグが存在しない場合は、定義されているかどうかを無視します。

編集: on メソッドは 7 つのパラメーターしか使用できないようです。この 7 つのパラメーター制限を回避する方法はありますか?

また、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))
)

この句は、 の出力が実際の SQL に表示されるのをinhibitWhen常に防止する必要がありますが、if/else が を返すことを許可します。1 === 1LogicalBoolean

于 2013-06-21T05:10:41.610 に答える