多个对象上的Groupby在SLICK中生成无效的SQL [英] Groupby on multiple objects generates invalid SQL in slick

查看:0
本文介绍了多个对象上的Groupby在SLICK中生成无效的SQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个计算QuestionAnswer的可能分数的查询,当执行该查询时,我得到了PSQLException

模型信息

一个问题回答者可以有几个(至少一个)问题回答可能性,因为有多种方法可以正确回答问题。

每一个questonAnswerPosability都有几个questonAnswerPart,在下面的查询中,我们查询每个questonAnswerPosability的分数。

有问题的查询

查询本身会生成SQL,但无法执行该SQL

  def queryMogelijkePuntenByVragenViaOpenVragen()(implicit session: Session) = {
    (for{
      ovam <- OpenVraagAntwoordMogelijkheden //questionAnswerPossibilites
      ovad <- OpenVraagAntwoordOnderdelen if ovad.ovamId === ovam.id //questionAnswerParts
      ova <- OpenVraagAntwoorden if ovam.ovaId === ova.id //questionAnswers
    } yield ((ova, ovam), ovad.punten))
      .groupBy{ case ((ova, ovam), punten) => (ova, ovam)}
      .map{ case ((ova, ovam), query) => (ova, ovam, query.map(_._2).sum)}
}

这里生成的SQL(PostgreSQL)

select x2."id", x2."vraag_id", x3."id", x3."volgorde", x3."ova_id", sum(x4."punten") 
from "open_vraag_antwoord_mogelijkheden" x3, "open_vraag_antwoord_onderdelen" x4, "open_vraag_antwoorden" x2 
where (x4."ovam_id" = x3."id") and (x3."ova_id" = x2."id")
group by (x2."id", x2."vraag_id"), (x3."id", x3."volgorde", x3."ova_id")

问题是SQL无法执行,我收到以下错误

play.api.Application$$anon$1:
Execution exception[[
PSQLException: ERROR: column "x2.id" must appear in the GROUP BY clause or be used in an aggregate function
  Position: 8]]

生成的SQL包含的方括号太多,SQL的最后一部分应为

group by x2."id", x2."vraag_id", x3."id", x3."volgorde", x3."ova_id"
无论如何巧妙地使用括号生成它,我是不是做错了什么?或者这是一个错误?

推荐答案

我解决了问题

...
    } yield ((ova.id, ovam.id), ovad.punten))

因为我现在只生成了nersecary id,而不是所有数据,所以生成的SQL不包含导致SQL错误的不必要的大括号。

我真的想要更多的数据,而不仅仅是那些id,但我可以通过将此查询用作子查询来解决此问题,外部查询将为我获取所有需要的数据。

这篇关于多个对象上的Groupby在SLICK中生成无效的SQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆