有两个表/实体:AppleTree和Apples。苹果树产生0.n个苹果。每个苹果都是第二个表的一个实体/行,并引用了产生它的苹果树(ManyToOne)。
我想写一篇关于最高产苹果树的“高分”报告。它应由COUNT列按降序排列:
APPLE TREE | COUNT(A)
---------------------
10304 | 1000
72020 | 952
31167 | 800为了处理这些结果,我创建了一个非实体bean,它结合了一个AppleTree对象和一个长值(用于计数):
// 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不幸的是,它产生了相当多的错误消息。我认为一个问题是计数值的列别名。我使用它是因为我想根据这个聚合值进行排序。无论我使用“计数(A)作为c”还是“计数(A) c”,这意味着没有区别。它说这些论点不是用逗号隔开的。此外,“表达式无效,这意味着它不遵循JPQL语法”。最后,它说找不到与参数类型匹配的构造函数。“
有办法获取我的AppleStats结果行吗?还是我必须回归到本机查询?
发布于 2014-08-25 02:15:53
请尝试以下查询:
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()聚合函数会出现两次,这是编写查询时非常常见的成语,任何合适的优化器都应该能够处理它并只执行一次操作。
https://stackoverflow.com/questions/25477734
复制相似问题