MrS*_*rub 5 java select jpa aggregate-functions jpql
有2个表/实体:AppleTree
和Apples
.一棵苹果树产生0 ... n个苹果.每个苹果都是第二个表的实体/行,并引用生成它的苹果树(ManyToOne
).
我想为最高产的苹果树制作一份"高分"报告.它应按COUNT列按降序排序:
APPLE TREE | COUNT(A)
---------------------
10304 | 1000
72020 | 952
31167 | 800
Run Code Online (Sandbox Code Playgroud)
为了处理这些结果,我创建了一个非实体bean,它结合了AppleTree对象和long值(对于COUNT):
// constructor
public AppleStats (AppleTree at, long howManyApples) { ... }
Run Code Online (Sandbox Code Playgroud)
我想使用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
Run Code Online (Sandbox Code Playgroud)
不幸的是,它产生了很多错误信息.我认为一个问题是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
Run Code Online (Sandbox Code Playgroud)
不幸的是,我现在没有 JPA 平台来测试它,但上面的内容应该可以修复原始查询的语法问题。并且不用担心COUNT()
聚合函数出现两次,这是编写查询时非常常见的习惯用法,任何像样的优化器都应该能够处理它并只执行一次操作。