Grails: проблема «не в агрегатной функции» с HQL-запросом - PullRequest
0 голосов
/ 31 марта 2011

Запросы по HQL с

select a from Article a join a.tags t 
where t.name in (:tags) 
group by a 
having count(t)=:tag_count

Использование HSQLDB в Grails создает исключение SqlException "Не в статистической функции ...". Глядя на сгенерированный SQL предоставляет

SELECT a.id, a.title, a.url, ....
..
GROUP BY a.id
HAVING ..

В некоторых продуктах MySQL это работает, я слышал, но, видимо, не в HSQLDB. Я не понимаю:

  1. Почему Hibernate генерирует ошибочный SQL? Или нет?
  2. Почему HSQLDB не позволяет группировать по просто идентификатор при выборе лота, я имею в виду его первичный ключ, и мой SELECT не вводит неопределенные значения, такие как случайное или текущее время

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Только что обнаружил эту ошибку в трекере проблем Hibernate. Кажется, это известная проблема, которая существует уже пять лет ... Невероятно. Всегда удивительно видеть, что, казалось бы, фундаментальные вещи могут быть сломаны в течение такого долгого времени.

0 голосов
/ 31 марта 2011

Этот тип запроса фактически разрешен текущим стандартом SQL, если идентификатор является столбцом первичного ключа. Но это считается дополнительной функцией Стандарта и не обязательно должно поддерживаться ядрами баз данных.

HSQLDB 2.x поддерживает это, когда ID является столбцом первичного ключа.

0 голосов
/ 31 марта 2011

Сгенерированный SQL не очень правильный, так как мы должны GROUPBY все неагрегированные свойства в предложении SELECT.Например:

SELECT name,category FROM books
GROUP BY category;

Приведенный выше запрос выдаст ложные данные, поскольку он даст только 1 строку для категории (даже если работает в MySQL).Вместо этого это должно быть сделано так:

SELECT name,category FROM books
GROUP BY name,category;

РЕДАКТИРОВАТЬ : После еще нескольких исследований я понимаю, что MySQL - тот, кто не следует этому правилу.Для оптимизации запросов MySQL разрешает не полный запрос GROUP BY (по умолчанию есть возможность отключить эту функцию).Если вы выполните запрос в других базах данных, таких как Oracle или HSQLDB, вы получите ошибки.Подробный ответ можно найти в этом вопросе .

EDIT2 : чтобы переписать запрос по-своему, нет другого средства, кроме перечисления всех неагрегированных выбранныхсвойства в Group By пункте.Начиная с Hibernate doc :

В настоящее время Hibernate также не раскрывает сгруппированную сущность, поэтому вы не можете записывать group by cat, если все свойства cat не агрегированы.Вы должны перечислить все неагрегированные свойства явно.

@ Том: Но я думаю, что, возможно, вам не нужны все поля в таблице Article.Если это так, не могли бы вы предоставить больше информации о классе домена и о том, что вы собираетесь запросить, чтобы мы могли видеть проблему яснее?

...