2

QuestionAnswer の可能なスコアを計算するクエリを作成しています。クエリを実行すると、SlickException が発生します。

モデルに関する情報

質問に正しく答える方法は複数あるため、QuestionAnswer には複数の (少なくとも 1 つの) questionAnswerPossibilities を含めることができます。

すべての questionAnswerPossibility には複数の questionAnswerParts があります。以下のクエリでは、questionAnswerPossibility ごとにスコアをクエリします。

問題の あるクエリ これは例外を与えるクエリです

  def queryAnswersWithScore()(implicit session: Session) = {
    (for{
      ovam <- OpenVraagAntwoordMogelijkheden //questionAnswerPossibility
      ovad <- OpenVraagAntwoordOnderdelen if ovad.ovamId === ovam.id //questionAnswerPart
      ova <- OpenVraagAntwoorden if ovam.ovaId === ova.id //questionAnswer
    } yield (ova, ovam, ovad.score))
      .groupBy{ case (ova, ovam, score) => (ova, ovam)}
      .map{ case ((ova, ovam), query) => ((ova, ovam), query.map(_._3).sum)}
  }

ただし、このクエリを実行すると、次の例外が発生します。(クエリ オブジェクトで .list が呼び出されたときにスローされます)

lay.api.Application$$anon$1: Execution exception[[SlickException: Cannot select Path s2 in Ref s3]]
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.3]
    at play.api.DefaultApplication.handleError(Application.scala:383) ~[play_2.10.jar:2.1.3]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$handleAction$1$2$$anonfun$apply$21.apply(PlayDefaultUpstreamHandler.scala:415) ~[play_2.10.jar:2.1.3]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$handleAction$1$2$$anonfun$apply$21.apply(PlayDefaultUpstreamHandler.scala:415) ~[play_2.10.jar:2.1.3]
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$handleAction$1$2.apply(PlayDefaultUpstreamHandler.scala:415) ~[play_2.10.jar:2.1.3]
scala.slick.SlickException: Cannot select Path s2 in Ref s3
    at scala.slick.compiler.FuseComprehensions.select(Relational.scala:348) ~[slick_2.10-1.0.1.jar:1.0.1]
    at scala.slick.compiler.ConvertToComprehensions$$anonfun$5.applyOrElse(Relational.scala:126) ~[slick_2.10-1.0.1.jar:1.0.1]
    at scala.slick.compiler.ConvertToComprehensions$$anonfun$5.applyOrElse(Relational.scala:119) ~[slick_2.10-1.0.1.jar:1.0.1]
    at scala.slick.ast.NodeOps$.replace(Util.scala:95) ~[slick_2.10-1.0.1.jar:1.0.1]
    at scala.slick.ast.NodeOps$.replace$extension(Util.scala:52) ~[slick_2.10-1.0.1.jar:1.0.1]
    at scala.slick.ast.NodeOps$$anonfun$replace$1$$anonfun$applyOrElse$1.apply(Util.scala:95) ~[slick_2.10-1.0.1.jar:1.0.1]

機能する同様のクエリ この代替クエリは機能します。ここでの違いは、questionAnswer (ova) オブジェクトを選択していないことです。1 つのオブジェクトで group by を呼び出すと、すべてが正常に機能します

  def queryAnswersWithScore()(implicit session: Session) = {
    (for{
      ovam <- OpenVraagAntwoordMogelijkheden //questionAnswerPossibility
      ovad <- OpenVraagAntwoordOnderdelen if ovad.ovamId === ovam.id //questionAnswerPart
    } yield (ovam, ovad.score))
      .groupBy{ case (ovam, score) => ovam}
      .map{ case (ovam, query) => (ovam, query.map(_._2).sum)}
  }

すべての questionAnswer のスコアを選択するクエリが本当に必要なので、この代替クエリは私の問題の解決策ではありません。

アップデート

クエリを更新し、SQL を生成するようになりましたが、結果が無効です。複数のオブジェクトでGroupbyが無効なSQLを生成するを参照 してください

4

0 に答える 0