当前位置: 首页 > 面试题库 >

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

赫连黎昕
2023-03-14
问题内容

有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结果行?还是我必须回归本机查询?


问题答案:

试试这个查询:

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



 类似资料:
  • 问题内容: 我有一个这样的数据框说 和会话和收入的每个值代表了一种类型的,我要统计每个种类的数量表示的数量和的为1。 在无法输出所需结果后,我发现简单的调用函数。 我怎样才能做到这一点? 问题答案: 您似乎想一次按几列分组: 应该给你你想要的

  • 问题内容: 我正在使用angular-filter中的 groupBy 按对象的date属性对对象数组进行分组。 产生以下内容: 如何从最近的日期开始颠倒顺序?当我打印到控制台时,以我想要的顺序打印阵列: 我还编写了一个自定义过滤器来反转groupBy之后的顺序: 我已经这样申请了: 问题答案: 最近有同样的问题。创建一个对象,但需要一个数组,因此涉及一些时髦。我最终从他们的问题页面直接得到了答案

  • 我需要将以下查询转换为hibernate条件查询。请帮忙 由于投票表上的复合主键,我用@Embeddable分隔了主键,所以后面的createQuery不起作用 和可嵌入对象 请建议一个更好的方法。

  • 1)使用的第一个查询...大约用了23秒 目前我修改了查询..这需要大约9秒 我不确定要做的表演是什么?我希望这个查询是快速的..我尝试索引rid和id,但这仍然使查询变得更糟。 下面是表格的详细信息 mza_movie_upload MZA_Movie_Statics

  • 我有3个表表艺术家与artist_id,名称; 带有唱片集id、艺术家id、姓名的表格唱片集; song_id、artist_id、album_id的桌子歌曲(更多的东西,但我认为它们对这个问题没有必要); 我想选择一个表与艺术家的名字,专辑数量等于或超过10首歌,数量或专辑少于10首歌。 要计算每张专辑的歌曲数量是这样的: 现在我意识到我将不得不使总和,如果像这样的地方,使超过1选择只是看不到如

  • 问题内容: 1> 套装2排 2> 套装2排 3> 一组1行 为什么查询方式1>和2>会得到相同的结果?count(*)和count(somefiled)之间没有什么区别? 另外,查询2>和3>导致的结果不同,为什么 groupby 如此神奇?它是如何工作的? 更新:我正在使用MySQL5.1。:) 问题答案: 选择会给您一个结果集。如果按字段分组选择,则结果集的行将按该字段分组,并且结果集的每一行