2

我正在编写一个查询来计算 QuestionAnswer 的可能分数,在执行查询时我得到一个 SlickException

关于模型的信息

QuestionAnswer 可以有多个(至少一个) 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) 对象。当我在一个对象上调用 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 选择分数的查询,这是通过从 questionAnswerPossibilities 中选择这个 questionAnswer 的最大分数来计算的

更新

我更新了我的查询,现在我得到它来生成 sql,但是结果无效。请参阅 Groupby 对多个对象在 slick 中生成无效 SQL

4

0 回答 0