Frage

Ich arbeite die Testsuite für ein Projekt von uns auf die Reparatur, die durch Hibernate / DBUnit getestet wird. Es gibt mehrere Testfälle, die alle eine ähnliche Ausnahme von Hibernate werfen, die etwa wie folgt aussieht:

java.sql.SQLException: Nicht in Aggregatfunktion oder eine Gruppe von Klausel: org.hsqldb.Expression@109062e in statement [... bla ...]

Durch meine googeln, ich bin misstrauisch, dass dies durch unsere Nutzung der Aggregatfunktion AVG verursacht wird (), wie dies in der Ausnahme Botschaft ist, und alle Abfragen, die enthalten sie werfen. Allerdings entdecken ich mehrere Links zu Personen, die diese Fehler waren immer, und war in der Lage, es zu beheben, indem Sie entweder ein „ORDER BY“ zu kommentieren oder „GROUP BY-Klausel“, oder indem Sie die anderen Spalten aus der SELECT-Klausel in der Gruppierung einschließlich. Ich verstehe, warum dies würde eine solche Fehlermeldung beheben, aber ich bin nicht sicher, ob es für meine Situation gilt, weil ich das gleiche versucht zu tun, und es machte keinen Unterschied. Außerdem haben wir einige Testfälle werfen Ausnahmen, die ORDER / GROUP verwenden, aber nicht alle. Zum Beispiel:

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();

Diese Abfrage verursacht auch die gleiche Ausnahme ausgelöst werden, auch wenn es keine ORDER / GROUP-Klausel nicht verwendet. Auch ich schneiden / Einfügen des erzeugten HSQL Code aus dem Ruhezustand direkt in den MySQL Query Browser, und es lief ohne Probleme. Außerdem ist es erwähnenswert, dass alle dieser Code funktioniert gut auf unsere Produktionsdatenbank, also bin ich wirklich verwirrt, warum es wirft hier.

Einige andere potenziell nützliche Informationen - wir eine flache XML-Datenbankstruktur mit einigen Dummy-Testdaten für die Testfälle verwenden und der MySQL-Dialekt für Hibernate. Wir verwenden DBUnit 2.4.3 / Hibernate 3.2.6. Ich habe versucht, die neueste Hibernate, Version 3.3.1, aber es verhielt sich das gleiche.

würden Alle Hinweise oder Hinweise sehr dankbar.

War es hilfreich?

Lösung

Wenn Sie eine Aggregatfunktion (z AVG()) in dem SELECT-Teil der SQL-Abfrage zusammen mit anderen Nicht-Aggregate Ausdrücke verwenden, dann müssen Sie eine GROUP BY-Klausel, die alle Nicht-Aggregatausdrücke Liste sollte.

Ich bin mit Java nicht vertraut, aber Blick auf den Code, es sieht aus wie es geht zu erstellen und eine Abfrage in etwa so laufen (nicht ganz richtig, aber nahe genug, glaube ich):

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

... Dies hat keine GROUP BY, aber nicht aggregiert und nicht-Aggregat Ausdrücke in der SELECT-Klausel mischen. Das Problem ist, dass die SQL ist schlecht ausgebildet.

Das Update wäre ein GROUP BY bis zum Ende der Abfrage hinzuzufügen.

Ich kann nicht sagen, warum dies in Ihrem Produktionssystem arbeiten, aber ich vermute, dass es einiger feiner Unterschied besteht. Vielleicht ist das Hinzufügen von etwas automatisch die GROUP BY?

Können Sie einen Ausdruck des SQL per Post ausführt?

Andere Tipps

Auch ORDER BY funktioniert nicht in hsqldb, wenn die Order-by-Feld nicht ein String ist.

Leider führt dies in der nicht in Aggregatfunktion oder einer Gruppe von Klausel Fehlermeldung, die eine Gruppierung Problem vermuten lässt, damit die Verwirrung ...

Siehe auch: http://markmail.org/message/42vmifme4opz4jgl

In einigen Systemen (zB Talend) Abfrage funktioniert nicht, wenn es Kommentarzeilen Beispiel ist:

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

Gibt einen Fehler für MS SQL-Abfragen. Statt Kommentarzeile

  

-

Verwenden Sie diese Symbole zur Kommentierung

  

/ * und r.name ist nicht null * /

Vielleicht wird es jemand helfen und Zeit sparen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top