consulta SQL lança “não em função de agregação ou grupo pela cláusula” exceção

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

  •  06-09-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando em reparar o conjunto de testes para um projeto nosso, que está sendo testado através de Hibernate / DBUnit. Há vários casos de teste que todos lançar uma exceção similar do Hibernate, que é algo como isto:

java.sql.SQLException: Não em função de agregação ou grupo pela cláusula: org.hsqldb.Expression@109062e na declaração [... blá ...]

Através do meu googling, eu estou desconfiado de que isso é causado por nosso uso da AVG função agregada (), como este é na mensagem da exceção, e todas as consultas que lançam contê-lo. No entanto, descobri vários links para as pessoas que estavam recebendo esse erro, e foram capazes de corrigi-lo por qualquer comentando um ou cláusula "ORDER BY" "GROUP BY", ou incluindo as outras colunas da cláusula SELECT no agrupamento. Eu entendo por que isso iria corrigir tal uma mensagem de erro, mas eu não tenho certeza se ela se aplica a minha situação, porque eu tentei fazer o mesmo e isso não fez diferença. Além disso, temos alguns casos de teste lançar exceções que uso ORDER / GROUP, mas não todos. Por exemplo:

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 também faz com que a mesma exceção para ser acionada, mesmo que ele não usar uma cláusula ORDER / GROUP. Além disso, eu cortar / colar o código HSQL gerada a partir de Hibernate diretamente no navegador a consulta MySQL, e funcionou sem problemas. Além disso, é importante ressaltar que todo este código fina funciona em nosso banco de dados de produção, então eu estou realmente confuso sobre o porquê ele lança aqui.

Algumas outras informações potencialmente útil - nós estamos usando uma estrutura de banco de dados XML plano com alguns dados de teste simulado para os casos de teste, eo dialeto MySQL para hibernar. Estamos usando dbunit 2.4.3 / hibernate 3.2.6. Eu tentei usar o mais recente de hibernação, versão 3.3.1, mas ele se comportava da mesma.

Os ponteiros ou sugestões seria muito apreciada.

Foi útil?

Solução

Se você usar uma função agregada (por exemplo AVG()) na parte SELECT da consulta SQL, juntamente com outras expressões não-agregadas, então você deve ter uma cláusula GROUP BY que deve listar todas as expressões não-agregadas.

Eu não estou familiarizado com java, mas olhando para o código, parece que ele está indo para criar e executar um algo consulta como esta (não muito bem, mas perto o suficiente, eu acho):

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

... Isso não tem GROUP BY, mas faz misturar expressões de agregação e não-agregadas na cláusula SELECT. O problema é que o SQL é mal formado.

A correção seria adicionar um GROUP BY até o fim da consulta.

Eu não posso dizer por que isso está trabalhando em seu sistema de produção, mas eu suspeito que há alguma diferença sutil lá. Talvez algo está adicionando o GROUP BY automaticamente?

Você pode postar uma cópia impressa do SQL executa?

Outras dicas

Além disso, ORDER BY não funciona em hsqldb quando o fim-de campo não é uma String.

Infelizmente, isso resulta no Não em função de agregação ou grupo pela cláusula mensagem de erro, o que sugere um problema de agrupamento, daí a confusão ...

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

Em alguns sistemas (por exemplo Talend) consulta não funciona se existem linhas de comentário exemplo:

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

Dá um erro para consultas MS SQL. Em vez de linha de comentário

-

usar estes símbolos para comentar

/ * E r.name não é nulo * /

Talvez possa ajudar alguém e poupar algum tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top