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

问题描述

试试这个查询

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个表/实体:AppleTreeApples。一棵苹果树产生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结果行?还是我必须回归本机查询?

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”