簡體   English   中英

JPA JPQL:使用COUNT,GROUP BY和ORDER BY選擇SELECT NEW

[英]JPA JPQL: SELECT NEW with COUNT, GROUP BY and ORDER BY

有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()聚合函數會出現兩次的事實,這是編寫查詢時非常常見的習慣用法,任何體面的優化器都只能處理一次並執行一次操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM