2009-02-24 87 views
1

我正在修復我們正在通過Hibernate/DBUnit進行測試的項目的測試套件。有幾個測試用例都拋出了與Hibernate類似的異常,如下所示:SQL查詢拋出「不是在聚合函數或group by子句」異常

java.sql.SQLException:不在聚合函數或group by子句中:[email protected] in statement [ ... blah ...]

通過我的谷歌搜索,我懷疑這是由於我們使用聚合函數AVG(),因爲這是在異常的消息中,以及所有的查詢拋出包含它。但是,我發現了幾條鏈接,指向發生此錯誤的人員,並且可以通過註釋「ORDER BY」或「GROUP BY」子句或通過在分組中包含SELECT子句中的其他列來修復它。我明白爲什麼這會解決這樣一個錯誤信息,但我不確定它是否適用於我的情況,因爲我試着做同樣的事情,但沒有任何區別。另外,我們有一些測試用例拋出使用ORDER/GROUP的異常,但不是全部。例如:

ThingerVO myThinger = (ThingerVO)session.createQuery("SELECT new ThingerVO(" + 
"r.id, " + "u.id, " + "u.alias, " + "s.id, " + 
"s.name, " + "r.URL," + "AVG(v.rating), " + 
"r.totalCount, " + "r.isPrivate, " + "a.id, " + 
"a.name, " + "r.transactionId, " + "r.size, " + 
"u.hasPicture " + 
") FROM Thinger r LEFT OUTER JOIN r.votes as v, Table1S s " + 
"JOIN s.Table2A AS a, User u " + 
"WHERE r.userId = u.id AND " + 
"s.id = r.Table1SId AND " + 
"r.id = :thingId")  
.setInteger("thingId", thingId) 
.uniqueResult(); 

該查詢也會導致拋出同樣的異常,即使它不使用ORDER/GROUP子句。另外,我將從Hibernate生成的HSQL代碼直接剪切/粘貼到MySQL查詢瀏覽器中,並且運行沒有問題。另外,值得指出的是,所有這些代碼在我們的生產數據庫上都能正常工作,所以我很困惑它爲什麼在這裏拋出。

一些其他可能有用的信息 - 我們使用一個平面XML數據庫結構,其中包含一些測試用例的虛擬測試數據以及用於hibernate的MySQL方言。我們使用的是dbunit 2.4.3/hibernate 3.2.6。我嘗試使用最新的休眠,版本3.3.1,但它表現相同。

任何指針或提示將不勝感激。

回答

5

如果在SQL查詢的SELECT部分​​中使用聚合函數(例如AVG())以及其他非聚合表達式,則必須有一個GROUP BY子句,該子句應列出所有非聚合表達式。

我不熟悉Java,但看代碼,它看起來像它會創建並運行一個查詢這樣的事情(不完全正確,但足夠接近,我認爲):

SELECT r.id, 
     u.id, 
     u.alias, 
     s.id, 
     s.name, 
     r.URL, 
     AVG(v.rating), 
     r.totalCount, 
     r.isPrivate, 
     a.id, 
     a.name, 
     r.transactionId, 
     r.size, 
     u.hasPicture 
FROM Thinger r 
LEFT OUTER JOIN r.votes as v, 
        Table1S s 
JOIN s.Table2A AS a, User u 
WHERE r.userId = u.id 
AND s.id = r.Table1SId 
AND r.id = :thingId 

...這沒有GROUP BY,但在SELECT子句中混合了聚集和非聚合表達式。問題在於SQL很糟糕。

修復方法是在查詢的末尾添加一個GROUP BY

我不能說爲什麼這是在你的生產系統工作,但我懷疑那裏有一些微妙的差異。也許有些東西是自動添加GROUP BY

你可以發佈它執行的SQL的打印輸出嗎?

+0

好吧,我可以讓SWORN將我的SELECT子句中的所有列添加到GROUP BY中,但我想這就是我在夜間的凌晨調試時所得到的結果。無論如何,添加所有這些列(顯然減去AVG列)現在可以解決問題。謝謝! – 2009-02-24 11:19:15

4

另外,ORDER BY在順序字段不是字符串時不能在hsqldb中工作。

不幸的是,這導致不在聚合函數或分組由錯誤消息,這表明分組問題,因此混亂...

參見:

SELECT r.id, 
    u.alias, 
    AVG(v.rating), 
    r.totalCount 
FROM Thinger r 
LEFT OUTER JOIN r.votes as v, 
        Table1S s 
JOIN s.Table2A AS a, User u 
WHERE r.userId = u.id 
AND s.id = r.Table1SId 
AND r.id = :thingId 
--AND r.name is not null 
GROUP BY r.id, u.alias, r.totalCount 

給出的MS SQL查詢的錯誤:http://markmail.org/message/42vmifme4opz4jgl

0

在一些系統(例如拓藍),如果有註釋行例如查詢不起作用。相反,註釋行的

-

使用這些符號註釋

/*和r.name不爲空*/

也許它會幫助某人並節省一些時間。

相關問題