[JPA] JPQL 집합 함수 group by 와 having
- 데이터베이스/JPA
- 2022. 11. 25.
반응형
집합함수
집합함수는 다음과 같은 특징이 있습니다.
- 집합함수는 값을 계산해서 하나의 값으로 반환하는 함수입니다.
- 보통 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 |
---|