SQL-запрос выдает исключение «не в агрегатной функции или группе по предложению» - PullRequest
1 голос
/ 24 февраля 2009

Я работаю над ремонтом тестового набора для нашего проекта, который тестируется через Hibernate / DBUnit. Существует несколько тестовых случаев, которые выдают похожее исключение из Hibernate, которое выглядит примерно так:

java.sql.SQLException: Не в агрегатной функции или группе по выражению: org.hsqldb.Expression@109062e в выражении [... blah ...]

Из-за моего поиска в Google я подозреваю, что это вызвано тем, что мы используем агрегатную функцию 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, и он работал без проблем. Кроме того, стоит отметить, что весь этот код прекрасно работает с нашей производственной базой данных, поэтому я действительно не понимаю, почему он выдает здесь.

Некоторая другая потенциально полезная информация - мы используем плоскую структуру базы данных XML с некоторыми фиктивными тестовыми данными для тестовых случаев и диалект MySQL для спящего режима. Мы используем dbunit 2.4.3 / hibernate 3.2.6. Я пытался использовать последнюю версию hibernate, версии 3.3.1, но он вел себя так же.

Любые указатели или подсказки будут с благодарностью.

Ответы [ 3 ]

7 голосов
/ 24 февраля 2009

Если вы используете агрегатную функцию (например, AVG()) в части SQL-запроса SELECT вместе с другими неагрегированными выражениями, то у вас должно быть предложение 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 в конец запроса.

Я не могу сказать, почему это работает в вашей производственной системе, но я подозреваю, что есть небольшая разница. Возможно, что-то добавляет GROUP BY автоматически?

Можете ли вы опубликовать распечатку SQL, который он выполняет?

4 голосов
/ 22 января 2010

Кроме того, ORDER BY не работает в hsqldb, когда поле упорядочения не является строкой.

К сожалению, это приводит к сообщению об ошибке Not ingregate function or group by clause , которое предлагает проблему группировки, отсюда и путаница ...

См .: http://markmail.org/message/42vmifme4opz4jgl

0 голосов
/ 27 марта 2014

В некоторых системах (например, TALEND) запрос не работает, если есть строки комментариев, например:

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

Выдает ошибку для запросов MS SQL. Вместо строки комментария

-

используйте эти символы для комментирования

/ * AND r.name не является нулевым * /

Может быть, это кому-нибудь поможет и сэкономит время.

...