1

Hibernate/DBUnit を介してテストされている私たちのプロジェクトのテスト スイートの修復に取り組んでいます。次のような Hibernate から同様の例外をスローするいくつかのテスト ケースがあります。

java.sql.SQLException: 集計関数または group by 句ではありません: ステートメント内の org.hsqldb.Expression@109062e [... 何とか ...]

グーグルで調べたところ、これは集計関数 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 句を使用していないにもかかわらず、同じ例外がスローされます。また、生成された HSQL コードを Hibernate から直接 MySQL クエリ ブラウザにカット アンド ペーストしたところ、問題なく実行されました。また、このコードはすべて実稼働データベースで正常に機能することを指摘しておく価値があるため、なぜここでスローされるのか、私は本当に混乱しています.

その他の潜在的に役立つ情報 - テスト ケース用のダミー テスト データと休止状態用の MySQL ダイアレクトを含むフラットな XML データベース構造を使用しています。dbunit 2.4.3/hibernate 3.2.6 を使用しています。最新の休止状態バージョン 3.3.1 を使用してみましたが、同じように動作しました。

ポインタやヒントは大歓迎です。

4

3 に答える 3

7

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、クエリの最後に a を追加することです。

これが本番システムで機能している理由はわかりませんが、微妙な違いがあるのではないかと思います。おそらく何かがGROUP BY自動的に追加されていますか?

実行する SQL のプリントアウトを投稿できますか?

于 2009-02-24T10:47:39.327 に答える
4

また、ORDER BYorder-by フィールドが String でない場合、hsqldb では機能しません。

残念ながら、これによりNot in aggregate function or group by 句のエラー メッセージが表示され、グループ化の問題が示唆されるため、混乱が生じます...

参照: http://markmail.org/message/42vmifme4opz4jgl

于 2010-01-22T16:18:04.100 に答える