[英]JPA JPQL: SELECT NEW with COUNT, GROUP BY and ORDER BY
有2個表/實體: AppleTree
和Apples
。 一棵蘋果樹產生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.