2011-03-31 5 views
0

Grails에서 HSQLDB를 사용하여 xqlxz Grails : HQL 쿼리의 "집합 함수가 아닙니다"문제

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

로 HQL 쿼리하기 SqlException "Not in aggregate function ..."이 발생합니다. 생성 된 SQL을 살펴보면

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

가 제공됩니다. 일부 MySQL 제품에서는이 기능이 작동하지만 HSQLDB에서는 들리지 않았습니다. 나는 이해하지 못한다 :

  1. 왜 Hibernate는 잘못된 SQL을 생성합니까? 아니면 그렇지 않습니까?
  2. HSQLDB가 에서 그룹핑을 허용하지 않는 이유는 무엇입니까? 로트를 선택하는 동안 그냥 ID를 사용했습니다. 결국 기본 키를 의미합니다. SELECT는 무작위 또는 현재 시간과 같은 비 결정적 값을 제공하지 않습니다.

답변

1

그냥 최대 절전 모드 문제 추적기에서 this bug을 찾았습니다. 이것은 5 년 동안 주변에 있었던 알려진 문제인 것 같습니다 .... 믿을 수 없습니다. 겉보기에는 근본적인 일이 그렇게 오랜 시간 동안 깨질 수 있다는 것을 항상 놀라워합니다.

0

으로 비결정론 값을 소개하지 않습니다 생성 된 SQL은 SELECT 절의 모든 집계되지 않은 속성을 GROUPBY해야하므로 적절하지 않습니다. 예를 들어 : 그것은 단지 범주에 대한 1 개 행을 제공하기 때문에

SELECT name,category FROM books 
GROUP BY category; 

위의 쿼리는 (심지어는 MySQL에서 실행), 거짓 데이터를 제공 할 것입니다. 대신, 다음과 같이 수행해야합니다 :

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

편집 : 좀 더 조사 후, 나는 MySQL이 규칙을 따르지 않는 하나라고 알고 있습니다. 쿼리 최적화를 위해 MySQL은 전체 GROUP BY 쿼리를 허용하지 않습니다 (기본적으로이 함수를 해제하는 옵션이 있습니다). Oracle 또는 HSQLDB와 같은 다른 데이터베이스에서 쿼리를 실행하면 오류가 발생합니다. 세부 답변은 this question입니다.

EDIT2 : 귀하의 방식으로 쿼리를 다시 작성하려면 Group By 절에있는 모든 비 집계 선택된 속성을 나열하는 것 외에 다른 의미는 없습니다. Hibernate doc에서 :

Hibernate는 또한 현재 은 그룹화 된 개체를 확장하지 않는, 그래서 당신은 고양이로하지 쓰기 그룹은 고양이의 모든 속성이 아닌 집계 할 수 있습니다. 모든 집계되지 않은 속성 을 명시 적으로 나열해야합니다.

@ 톰 :하지만 아마도 기사 테이블에 모든 입력란이 필요하지 않을 수도 있습니다. 그렇다면 도메인 클래스에 대한 자세한 정보와 쿼리 할 내용을 알려 주시면 문제를보다 명확하게 볼 수 있습니다.

+0

@Tom : 답변을 업데이트했습니다. 검토하시기 바랍니다. –

+0

자, 그래도 열심히 MySQL을 이해하는 것이 아니라 Grails/HQL 응용 프로그램이나 DataSource/HSQLDB 구성에서 Hibernate가 제대로 작동하도록하는 방법에 대해 걱정하지 않습니다. – Tom

+0

@Tom : 그래서 당신은 Hibernate가 유효한 SQL 질의를 생성하게하고 싶습니까? HSQLDB에이 옵션을 풀 수있는 옵션이 있는지 알지 못하지만 쿼리를 변경할 수 있습니다. –

0

ID가 기본 키 열인 한이 유형의 쿼리는 실제로 현재 SQL 표준에서 허용됩니다. 그러나 이것은 표준의 선택적 기능으로 간주되며 데이터베이스 엔진에서 지원할 필요는 없습니다.

HSQLDB 2.x는 ID가 기본 키 열인 경우이를 지원합니다.

관련 문제