흰 스타렉스에서 내가 내리지

JPQL 서브쿼리, BETWEEN, IN, LIKE, NULL, 컬렉션 식 본문

JPA

JPQL 서브쿼리, BETWEEN, IN, LIKE, NULL, 컬렉션 식

주씨. 2024. 4. 14. 12:43
728x90

# 서브쿼리

  • 나이가 평균보다 많은 회원
select m from Member m
where m.age > (select avg(m2.age) from member m2)

 

 

  • 한 건이라도 주문한 고객
select m from Member m 
where (select count(o) from Order o where m = o.member) > 0

 

이 쿼리는 컬렉션 값 연관 필드의 size 기능을 사용해도 같은 결과를 얻을 수 있다.

select m from Member m
where m.orders.size > 0

 

 

# 서브쿼리 - EXISTS

서브 쿼리에 결과가 존재하면 참이다. NOT 은 반대.

 

  • 팀 A 소속의 회원
select m from Member m 
where exists (select t from m.team t where t.name = '팀A')

 

 

# 서브쿼리 - {ALL | ANY | SOME}

- ALL : 조건을 모두 만족하면 참

- ANY | SOME : 조건을 하나라도 만족하면 참

 

  • 전체 상품 각각의 재고보다 주문량이 많은 주문들
select o from Order o
where o.orderAmount > ALL (select p.stockAmount from Product p)

 

  • 어떤 팀이든 팀에 소속된 회원
select m from member m 
where m.team = ANY (select t from Team t)

 

 

# 서브 쿼리 - IN

- 서브 쿼리의 결과 중 하나라도 같은 것이 있으면  참. 

- IN 은 서브쿼리가 아니어도 사용할 수 있다.

 

  • 20세 이상을 보유한 팀
select t from Team t
where t IN (select t2 from Team t2 join t2.members m2 where m2.age >= 20)

 

 

# BETWEEN

- X [NOT] BETWEEN A AND B

- X는 A ~ B 사이의 값이면 참 

 

  • 나이가 10~20 인 회원을 찾기
select m from Member m 
where m.age between 10 and 20

 

 

# IN

  • 이름이 A 혹은 B 인 회원을 찾기
select m from Member m 
where m.username in ('A', 'B')

 

 

# LIKE

- [NOT] LIKE 패턴값 [ESCAPE 이스케이프 문자]

- 문자 표현식과 패턴값을 비교한다.

- % : 아무 값들이 입력되어도 된다. 값이 없어도 됨

- _ : 한 글자는 아무 값이 입력되어도 되지만 값이 있어야 한다

 

select m from Member m
where m.username like '%원%'

-- 회원%
where m.username like '회원\%' ESCAPE '\'

 

 

# NULL 비교식

- IS [NOT] NULL

where m.username is null

 

 

# 컬렉션 식

- 컬렉션 식은 컬렉션에만 사용하는 특별한 기능이다. 

 

 

# 빈 컬렉션 비교 식

  • 주문이 하나라도 있는 회원 조회
-- JPQL
select m from Member m
where m.orders is not empty

-- SQL
select m.* from Member m
where 
    exists (
        select o.id
        from Orders o
        where m.id = o.member_id
    )

 

 

# 컬렉션의 멤버 식

 

- {엔티티나 값} [NOT] MEMBER [OF] {컬렉션 값 연관 경로}

- 엔티티나 값이 컬렉션에 포함되어 있으면 참

 

 select t from Team t
 where :memberParam member of t.members