我正在编写一个计算QuestionAnswer可能得分的查询,在执行查询时我得到一个PSQLException
有关模型的信息
问题答案可以有多个(至少一个)问题答案可能性,因为有多种方法可以正确回答问题。
每个questionAnswerPossibility都有几个questionAnswerParts,在下面的查询中我们查询每个问题的答案答案可能性。
有问题的查询
查询本身确实生成了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"
然而光滑用括号生成它,我在这里做错了吗?或者这是一个错误吗?
答案 0 :(得分:0)
我解决了问题
...
} yield ((ova.id, ovam.id), ovad.punten))
因为我现在只生成nessecary id而不是所有数据,所生成的sql不包含导致SQL错误的不必要的括号。
我真的想要更多的数据而不仅仅是那些id,但我可以通过将此查询用作子查询来解决这个问题,外部查询将为我提取所有需要的数据。