【问题标题】:How to order by count() in JPA如何在 JPA 中按 count() 排序
【发布时间】:2011-10-23 11:51:00
【问题描述】:

我正在使用这个 JPA 查询:

SELECT DISTINCT e.label FROM Entity e 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC

我没有收到任何错误,结果排序几乎正确,但有些值错误(两个值被翻转或某些单个值完全放错了位置)

编辑:

将 COUNT(e.label) 添加到我的 SELECT 子句可以解决此查询的问题。

但在同样包含 WHERE 子句的类似查询中,问题仍然存在:

SELECT DISTINCT e.label, COUNT(e.label) FROM Entity e 
WHERE TYPE(e.cat) = :category 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC

【问题讨论】:

  • 您确定可以将:category 参数作为参数正确传递吗?尝试将所需的类类型直接放入 SQL 中。
  • 传入:category 工作正常。

标签: java jpa eclipselink


【解决方案1】:

您可能需要在 SELECT 子句中包含 COUNT(e.label)

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC

更新:关于第二个查询,请阅读 EntityManager 文档的8.6. Polymorphic queries 部分。似乎如果您以需要多个SELECTs 的方式进行查询,那么ORDER BY 将不再起作用。使用TYPE 关键字似乎就是这种情况。来自上述链接的引用:


以下查询将返回所有持久对象:
from java.lang.Object o // HQL only

Named 接口可能由各种持久类实现:

from Named n, Named m where n.name = m.name // HQL only

请注意,最后两个查询将需要多个 SQL SELECT。 这意味着 order by 子句没有正确排序整个结果集。(这也意味着您不能使用 Query.scroll() 调用这些查询。)


【讨论】:

  • 这适用于第一个查询,但不适用于具有WHERE 子句的另一个查询。
【解决方案2】:

出于某种原因,以下名为查询的样式对我不起作用:

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY COUNT(e.label) DESC

这可能是因为我使用的是旧版本的 Hibernate。我通过使用数字选择要排序的列来获得订单,如下所示:

SELECT DISTINCT e.label, COUNT(e.label) 
FROM Entity e 
GROUP BY e.label 
ORDER BY 2 DESC

【讨论】:

    【解决方案3】:

    看不出这个顺序怎么可能不正确。什么是不正确的结果?

    生成的 SQL 是什么,如果直接在数据库上尝试相同的 SQL,它会给出相同的错误顺序吗?

    你用的是什么数据库?

    您总是可以在 Java 中进行排序,而不是使用 sort()。

    【讨论】:

    • 在 java 中进行排序会不会效率低下,因为您必须将所有数据从数据库中取出到 java 内存中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2011-01-18
    • 2021-05-05
    相关资源
    最近更新 更多