2011-12-06 2 views
0

Hibernate를 통해 데이터베이스에 저장된 특정 데이터의 집합을 만들어야하므로 HQL을 사용하여 필요한 데이터를 얻고 싶습니다.Hibernate - 데이터를 집계하여 새로운 엔티티로 변환하는 좋은 방법

Transaction 
    id 
    userEmail 
    moneyPaid 

지금 .. 모든 금액을 집계하는 가장 좋은 방법은 userEmail에 의해 결정된 사용자가 지불 한 금액입니다. aggregate moneyPayd 속성을 사용하여 사용자 이메일을 보유 할 엔티티를 반환하고 싶습니다.

그렇게하기위한 가장 훌륭하고 우아한 방법은 무엇입니까?

내가 다른 기업이 있다면 아마도 사용자 말 :

User 
    id 
    email 
    address 

이 거래 집계 moneyPaid와 사용자에 가입하고 같은 totaly 다른 유형의 엔티티의 목록을 반환 할 많은 코드에 포함되지 않은 편리한 방법이 있나요 :

AggregatedData 
    email 
    totalMoneyPaid 
    address 

나는이 작업을 수행하는 몇 가지 방법을 알고 있지만 모두 우아하지만 간결하지만 어떤 아이디어라도 좋습니다.

답변

5
select u.email, sum(t.moneyPaid), u.address from Transaction t 
left join t.user u 
group by u.email, u.address; 

I'am가 확인을하면, 반환으로 List<Object[]>을 원하지 않는다, 당신이 쓸 수 있습니다 :

select new org.sample.RequestResult(u.email, sum(t.moneyPaid), u.address) from Transaction t 
left join t.user u 
group by u.email, u.address; 

객체를 생성생성자 문자열 이메일, 롱 10 (또는 다른, 당신의 기업의 필드의 유형) moneyPaid 및 문자열

은 쿼리가 반환 주소를지도에서 것 반환하는 당신은 다른 단지 select new map(...)을 작성할 수 있습니다 List<RequestResult>

선택된 값에 대한 별칭

1
select u.email, sum(t.moneyPaid), u.address from Transaction t 
left join t.user u 
group by u.email, u.address; 

이 기능을 사용하려면 트랜잭션 엔터티에 userEmail 속성이 없어야하며 User 엔터티에 대한 ManyToOne 연결이 있어야합니다.

hibernate reference에는 연결 및 집계 함수에 대해 알아야 할 모든 것이 포함되어 있습니다. 분명히 SQL 집계 함수와 유사합니다.

위의 쿼리는 엔티티를 반환하지 않고 List<Object[]>, 각 Object[]은 이메일, 지불 한 총 돈 및 주소의 세 가지 요소를 포함합니다. 목록 위로 반복하여 AggregatedData 인스턴스 목록을 작성하십시오.

0

결과를 쿼리하기 위해 HQL을 사용 하시겠습니까? 그렇다면 HQL의 그룹 별 성명서가 그렇게 할 것이라고 생각합니다.

select t.userEmail, sum(t.moneyPaid) 
from Transaction t 
group by t.userEmail 

반환 유형이 무엇인지 (디버그하여 찾을 수 있는지) 확실하지 않습니다. 하지만 List<List<Object>> 일할 수도 있습니다.

웹 사이트 최대 절전 모드를 참조하십시오 (당신이 그것을 사용하기 전에 캐스팅을 할 필요가 그래서는 약하게, 입력 한) :이 쿼리 Query with HQL

관련 문제