JPA JPQL: SELECT NEW with COUNT, GROUP BY and ORDER BY



有2个表/实体:AppleTreeApples。一棵苹果树产0…n苹果。每个苹果都是第二个表的一个实体/行,并引用产生它的苹果树(ManyToOne)。

我想生成一份关于产量最高的苹果树的"高分"报告。它应该按COUNT列降序排列:

APPLE TREE | COUNT(A)
---------------------
10304      | 1000
72020      | 952
31167      | 800

为了处理这些结果,我创建了一个非实体bean,它结合了AppleTree对象和一个长值(用于COUNT):

// constructor
public AppleStats (AppleTree at, long howManyApples) { ... }

我想使用JPQL获取这种组合类型的行。我的方法基于SELECT NEW语法:

SELECT NEW foo.bar.AppleStats ( a.appleTree, COUNT(a) AS c )
FROM Apples a
GROUP BY a.appleTree
ORDER BY c DESC

不幸的是,它会产生相当多的错误消息。我认为一个问题是列别名的COUNT值。我用它来排序这个总和。这意味着无论我使用"COUNT(a) AS c"还是"COUNT(a) c"都没有区别。它说参数之间没有逗号分隔。此外,""表达式无效,这意味着它不遵循JPQL语法""。最后它说找不到与参数类型匹配的构造函数。"

有办法得到我的AppleStats结果行吗?或者我必须回归到本地查询?

试试这个查询:

SELECT NEW foo.bar.AppleStats(a.appleTree, COUNT(a.appleTree))
FROM Apples a
GROUP BY a.appleTree
ORDER BY COUNT(a.appleTree) DESC

不幸的是,我现在没有一个JPA平台来测试它,但是上面应该修复了原始查询的语法问题。不要担心COUNT()聚合函数出现两次,这是编写查询时非常常见的习惯用法,任何像样的优化器都应该能够处理它并只执行一次操作。

最新更新