requête SQL lance « pas fonction d'agrégation ou d'un groupe par clause » exception

StackOverflow https://stackoverflow.com/questions/581043

  •  06-09-2019
  •  | 
  •  

Question

Je travaille sur la réparation de la suite de tests pour un projet de la nôtre, qui est testé par Hibernate / DBUnit. Il y a plusieurs cas de test qui sont tous deux pas une exception similaire de mise en veille prolongée, ce qui ressemble à quelque chose comme ceci:

java.sql.SQLException: Pas fonction d'agrégation ou d'un groupe par clause: org.hsqldb.Expression@109062e dans la déclaration [... bla ...]

Par mon googler, je me méfie que cela est causé par notre utilisation de la fonction d'agrégat avg (), comme cela est dans le message de l'exception, et toutes les requêtes qui jettent en contiennent. Cependant, j'ai découvert plusieurs liens vers des personnes qui reçoivent cette erreur, et nous avons pu le réparer soit en commentant une clause « ORDER BY » ou « GROUP BY », ou en incluant les autres colonnes de la clause SELECT dans le groupe. Je comprends pourquoi cela fixerait un tel message d'erreur, mais je ne sais pas si elle s'applique à ma situation, parce que j'ai essayé de faire la même chose et il n'a fait aucune différence. , Nous avons aussi des cas de test lancer des exceptions qui utilisent l'ordre / GROUP, mais pas tous. Par exemple:

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

Cette requête provoque également la même exception à être jeté, même si elle n'utilise pas une clause ORDER / GROUP. En outre, je coupe / coller le code généré à partir HSQL Hibernate directement dans le navigateur de requêtes MySQL, et il a couru sans problème. Aussi, il est intéressant de souligner que tout ce code fonctionne très bien sur notre base de données de production, donc je suis vraiment confus quant à pourquoi il jette ici.

d'autres informations potentiellement utiles - nous utilisons une structure de base de données XML plat avec des données de test fictives pour les cas de test, et le dialecte MySQL pour mise en veille prolongée. Nous utilisons DBUnit 2.4.3 / mise en veille prolongée 3.2.6. J'ai essayé d'utiliser la dernière mise en veille prolongée, la version 3.3.1, mais il comportais même.

Les pointeurs ou des conseils seraient grandement appréciés.

Était-ce utile?

La solution

Si vous utilisez une fonction d'agrégation (par exemple AVG()) dans la partie SELECT de la requête SQL ainsi que d'autres expressions non agrégées, alors vous devez avoir une clause GROUP BY, qui devrait indiquer toutes les expressions non agrégées.

Je ne suis pas familier avec java, mais en regardant le code, il semble que ça va créer et exécuter une requête de quelque chose comme ça (pas tout à fait raison, mais assez proche, je pense):

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

... Cela n'a pas GROUP BY, mais ne se mêle des expressions globales et non globales dans la clause SELECT. Le problème est que le SQL est mal formé.

Le correctif serait d'ajouter un GROUP BY à la fin de la requête.

Je ne peux pas dire pourquoi cela fonctionne dans votre système de production, mais je pense qu'il ya une différence subtile là. Peut-être que quelque chose ajoute le GROUP BY automatiquement?

Pouvez-vous envoyer une copie papier de SQL il exécute?

Autres conseils

En outre, ORDER BY ne fonctionne pas dans hsqldb lorsque l'ordre par champ n'est pas une chaîne.

Malheureusement, cela se traduit par Non fonction d'agrégation ou d'un groupe par clause message d'erreur, ce qui suggère un problème de regroupement, d'où la confusion ...

Voir: http://markmail.org/message/42vmifme4opz4jgl

Dans certains systèmes (par exemple TALEND) requête ne fonctionne pas s'il y a des lignes de commentaire exemple:

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

Retourne une erreur pour les requêtes MS SQL. Au lieu de la ligne de commentaire

  

-

utiliser ces symboles pour commenter

  

/ * ET r.name est non nulle * /

Peut-être qu'il va aider quelqu'un et gagner du temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top