2012-09-06 4 views
1

Hibernate라는 이름의 쿼리로 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.컬렉션 아이템의 프로퍼티 값의 합계로 HQL 정렬하기

수집 항목의 속성을 기준으로 결과를 정렬하고 싶습니다. 이 예에 의해 가장 쉽게 생각 :

나는이 개 수업을 : A와 B

A가

B는 속성 "순위"가 B의 집합 인 속성 "학사"가 정수.

(모두)를 쿼리하고 A.Bs의 B.rank의 합계로 정렬하려고합니다. 같은

뭔가 :

select x from A as x order by sum(x.Bs.rank) 

희망이 의미가 있습니다! 위의 쿼리에서 "컬렉션을 역 참조하려는 잘못된 시도"오류가 발생합니다.

답변

0

SQL에서와 같이 select에 수동으로 테이블 b에 대한 액세스를 수동으로 추가해야합니다. SQL에서 당신은 위해 할 수있는

select a.key, a.col2, a.col3, ... from a, b 
    where a.key = b.foreignKeyFromA 
    group by a.key, a.col2, a.col3, ... 
    order by sum(b.rank); 

하면, 한 개의 HQL 문에 수동으로

select new A(a.key, a.col2, a.col3, ...) from A a join B b 
    group by a.key, a.col2, a.col3, ... 
    order by sum(b.rank) 

이 (당신은 피팅 생성자가 필요 같은 것을 그것을 구현해야하므로 최대 절전 모드가 자동으로 B이 액세스를 생성하지 않습니다 A와 B는 하나의 값으로 배열을 반환 할 수 있습니다. 매핑에 A와 B의 관계를 정의해야합니다.)

참고 : group by 절에서 다음을 수행해야합니다. 비록 당신이 선택하는 모든 열을 언급한다. ey은 더 이상 그룹화를 변경하지 않습니다 (키는 이미 고유합니다). 선택한 모든 열을 언급하지 않으면 Oracle 데이터베이스에서 오류가 발생합니다. MySQL은 이것을 필요로하지 않으며, group by a.key이면 충분하지만, 원칙적으로 모든 데이터베이스에서 작동하는 HQL 문을 작성해야합니다.

+0

매우 효과적이지 않습니다. A와 B가 매핑됩니다. 클래스 A 정의 : 그래서 나는 a와 b 사이의 관계를 매핑하는 별도의 테이블 (a_b)을 가지고 있습니다. 새 A()를 선택해야합니까? A에서 선택 *을 사용할 수 있습니까? 지금까지 많은 제안에 감사드립니다. – Nes

+0

아, 내 데이터베이스가 MySQL이라고 언급하는 것을 잊어 버렸습니다. – Nes

+0

새로운 A (a.key, a.col2, ...)를 선택하면 A의 인스턴스 목록을 얻습니다.'a.key, col2, ... '를 선택하면 객체의 배열의리스트 두 가지 모두 가능합니다. 내 코드가 더 좋은 예입니다. 그러나 당신은 HQL에서'A *'를 선택할 수 없으며 (적어도 Oracle에서는) 그룹과 함께 작동하지 않을 것입니다. - "잘 작동하지 않는다"는 것은 무엇을 의미합니까? 정확히 작동하지 않는 것은 무엇입니까 (오류 메시지 또는 가짜 결과)? - 너 정말 많은 관계가 있니?귀하의 예에서는 일대 다 (one-to-many) 일 수도있어서 다루기가 더 쉽습니다. – Johanna

0

A가 복잡하거나 상속하는 경우, 당신은 단지 그것을 ID의 얻을 할 수는 A의가 session.get(id)를 사용

select a.id, sum(b.rank) 
from A as a join a.Bs as b 
group by a.id 
order by sum(b.rank) 

로드.