JPA JPQL:使用COUNT,GROUP BY和ORDER BY选择NEW

MrS*_*rub 5 java select jpa aggregate-functions jpql

有2个表/实体:AppleTreeApples.一棵苹果树产生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结果行?或者我必须回归到本机查询?

Ósc*_*pez 5

尝试这个查询:

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()聚合函数出现两次,这是编写查询时非常常见的习惯用法,任何像样的优化器都应该能够处理它并只执行一次操作。