consulta SQL lanza “no en función de agregado o grupo por cláusula de” excepción

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

  •  06-09-2019
  •  | 
  •  

Pregunta

Estoy trabajando en la reparación del banco de pruebas para un proyecto de la nuestra, que está siendo probada a través de Hibernate / DBUnit. Hay varios casos de prueba que toda lanzar una excepción similar a partir de hibernación, que es como la siguiente:

java.sql.SQLException: No en función de agregado o grupo por la cláusula: org.hsqldb.Expression@109062e en la declaración [... bla ...]

A través de mi googling, yo soy sospechoso que esto es causado por el uso de la función de agregado AVG (), ya que es en el mensaje de la excepción, y todas las consultas que tirar lo contienen. Sin embargo, he descubierto varios enlaces a las personas que estaban recibiendo este error, y fueron capaces de solucionarlo, ya sea comentando a cabo una "ORDER BY" o "GROUP BY" cláusula, o mediante la inclusión de las otras columnas de la cláusula SELECT de la agrupación. Entiendo por qué esto sería fijar un mensaje de error, pero no estoy seguro de si se aplica a mi situación, porque he intentado hacer lo mismo y no había ninguna diferencia. Además, tenemos algunos casos de prueba que lanzan excepciones que utilizan ORDEN / grupo, pero no todos. Por ejemplo:

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

Esta consulta también hace que la misma excepción que se lance, a pesar de que no utiliza una cláusula ORDER / GRUPO. Además, corté / pegar el código generado a partir de hibernación HSQL directamente en el navegador consulta MySQL, y corrió sin problemas. Además, vale la pena señalar que todo este código funciona bien en nuestra base de datos de producción, así que estoy muy confundido en cuanto a por qué se lanza aquí.

Algunos otra información potencialmente útil - que estamos utilizando una estructura de base de datos XML plana con algunos datos de prueba ficticias para los casos de prueba, y el dialecto MySQL para hibernación. Estamos utilizando DBUnit 2.4.3 / 3.2.6 hibernación. He intentado utilizar la última hibernación, versión 3.3.1, pero se comportaban de la misma.

Cualquier punteros o sugerencias serían muy apreciados.

¿Fue útil?

Solución

Si utiliza una función de agregado (por ejemplo AVG()) en la parte SELECT de la consulta SQL, junto con otras expresiones no agregados, entonces usted debe tener una cláusula GROUP BY que debe enumerar todas las expresiones no agregadas.

No estoy familiarizado con Java, pero mirando el código, parece que se va a crear y ejecutar una consulta algo como esto (no del todo bien, pero lo suficientemente cerca, creo):

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

... Esto no tiene GROUP BY, pero hace mezclar expresiones agregadas y no agregadas en la cláusula SELECT. El problema es que el SQL está mal formada.

La solución sería añadir un GROUP BY hasta el final de la consulta.

No puedo decir por qué esto está funcionando en su sistema de producción, pero sospecho que hay alguna diferencia sutil allí. Tal vez algo es la adición de la GROUP BY de forma automática?

Se puede publicar una copia impresa del SQL se ejecuta?

Otros consejos

Además, ORDER BY no funciona en hsqldb cuando la orden por campo no es una cadena.

Desafortunadamente, esto resulta en el No en función de agregado o grupo por cláusula mensaje de error, lo que sugiere un problema de agrupamiento, por lo tanto, la confusión ...

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

En algunos sistemas (por ejemplo Talend) consulta no funciona si hay líneas de comentario ejemplo:

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

da un error para las consultas de MS SQL. En lugar de línea de comentario

  

-

utilizar estos símbolos para comentar

  

/ * Y r.name no es nulo * /

Tal vez pueda ayudar a alguien y ahorrar algo de tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top