2011-08-09 55 views
5
命令我使用這JPA查詢

如何通過計數()在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 
+0

您確定可以正確傳遞':category'參數作爲參數嗎?嘗試將所需的類類型直接放入SQL中。 – MicSim

+0

傳入':category'可以正常工作。 –

回答

12

您可能需要包括COUNT(e.label)你的SELECT子句中:

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

UPDATE:關於第二個查詢請閱讀EntityManager文檔的8.6. Polymorphic queries。看來,如果您以需要多個SELECT s的方式提出您的查詢,那麼ORDER BY將不再有效。使用TYPE關鍵字似乎是這種情況。從上面的鏈接引述:


下面的查詢將返回所有的持久化對象:

from java.lang.Object o // HQL only 

命名可能被各種各樣的持久化類實現的接口:

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

注意這些最後兩個查詢將需要多個SQL SELECT。 這意味着order by子句不能正確排序整個結果集。(這也意味着你不能調用使用Query.scroll()方法。這些查詢)


+0

這適用於第一個查詢,但不適用於具有'WHERE'子句的另一個查詢。 –

-1

無法看到的順序可能是不正確的。什麼是不正確的結果?

什麼是生成的SQL,如果您直接在數據庫上嘗試相同的SQL,它是否會給出相同的錯誤順序?

您使用的數據庫是?

您總是可以使用sort()來排序Java。

+0

因爲你不得不將所有數據從數據庫中取出到java內存中,所以在java中排序效率不高? – exic

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