[JPA] JPQL 집합 함수 group by 와 having

반응형

 집합함수 

집합함수는 다음과 같은 특징이 있습니다.

  • 집합함수는 값을 계산해서 하나의 값으로 반환하는 함수입니다.
  • 보통  group by 자주 같이 사용됩니다.
  • where 절에서 바로 사용할 수 없기 때문에 group by 이후에 having 또는 서브쿼리를 사용합니다.
함수 리턴타입 설명
count Long 개수를 구함
max, min Long 최대, 최소값 구함
avg Double 평균 구함
sum Long 합 구함

 

▼ 예제의 Player 엔티티는 Team 엔티티와 관계하고 있습니다.

 

 

 

 max, min, avg, sum은 해당 값이 존재하지 않는 경우 null을 값으로 리턴합니다. 다음과 같이 TypedQuery를 생성해서 getSingleResult() 메서드를 실행하면 각각 salary의 평균과 최고, 최소 값을 구합니다. 

select count(p), avg(p.salary), max(p.salary), min(p.salary) from Player p

 

 

Hibernate: 
select
	count(p),
	avg(p.salary),
	max(p.salary),
	min(p.salary) 
from
Player p
    count(player0_.player_id) as col_0_0_,
    avg(player0_.salary) as col_1_0_,
    max(player0_.salary) as col_2_0_,
    min(player0_.salary) as col_3_0_ 
from
    player player0_

 

 

 

 

 Group by 

▼ group by를 사용할 경우 getSingleResult가 아닌 getResultList 로 쿼리를 실행합니다. List<Object[]> 데이터 형으로 값을 저장하고 for 루프 문으로 해당 값들을 확인할 수 있습니다. 만약 직접 left join을 통해서 team을 조인 하는 경우에는 group by 에 직접 Team 엔티티로 조회합니다.

select p.team.id, count(p), avg(p.salary), max(p.salary), min(p.salary) from Player p group by p.team.id

 

 

 

 

 

 Having 

 다음은 team의 player가 1개 이상인 경우를 Having 절을 통해서 조회합니다. group by 절 이후에 다음 구문을 통하여 조회합니다. 이 역시 복수개의 결과를 받기 위해서 getResultList 메서드로 쿼리를 실행합니다.

 

 

반응형

'데이터베이스 > JPA' 카테고리의 다른 글

[JPA] JPQL 지정 속성 클래스 조회  (0) 2022.11.14

댓글

Designed by JB FACTORY