有2个表/实体:AppleTree
和Apples
。一棵苹果树产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()
聚合函数出现两次,这是编写查询时非常常见的习惯用法,任何像样的优化器都应该能够处理它并只执行一次操作。