问题描述
试试这个查询:
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()
聚合函数会出现两次的事实,这是编写查询时非常常见的习惯用法,任何体面的优化器都应该能够处理它并只执行一次操作。
解决方法
有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结果行?还是我必须回归本机查询?