JPA/Base

JPA - JPQL 기본 # 2 (조인, 서브 쿼리, 타입 표현)

2022. 8. 21. 11:29
728x90
반응형

✍JPA는 다양한 쿼리 방법을 지원.

예제 모델

 

💦 JPQL 문법 - JOIN

  • 내부 조인 : SELECT m FROM Member m [INNER] JOIN m.team t 
    Member에 Team이 없으면 해당 데이터 전체가 출력되지 않음.  
  • 외부 조인 : SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 
    Member에 Team이 없어도 데이터가 출력됨.
  • 세타 조인 : SELECT count(m) form Member m, Team t where m.username = t.name
    연관관계가 없는 테이블을 가져올 때. 

내부 조인
외부 조인

 

세타 조인

 

🔰 조인 - ON 절

- ON절을 활용한 조인 => 조인 대상 필터링 / 연관 관계 없는 엔티티 외부 조인

 

 

🔰 서브 쿼리 

- 기존 쿼리문에서 추가적으로 조건을 만들거나 할 때 서브 쿼리를 만들어 사용할 수 있음. 메인 쿼리와 서브 쿼리는 전혀 관계가 없다. (쿼리 안에 쿼리를 넣는 식)

 

- JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능.
- SELECT 에서도 가능 (Hibernate 에서는)
- FROM 절의 서브 쿼리는 현재 JPQL에서 불가능 -> 조인으로 풀 수 있으면 풀어서 해결

=> SQL에 FROM 절을 쓰는 로직이 필요한 경우, 해당 로직을 애플리케이션 단계에서 처리하자.

 

🔰 JPQL의 타입 표현

  • 문자 : 'HELLO', 'She's'
  • 숫자 : 10L(Long), 10D (Double), 10F (Float)
  • Boolean : TRUE FALSE
  • ENUM : jpabook.MemberType.Admin (패키지명 포함하여 기재.) 파라미터 바인딩을 통해 최소화 가능.
  • 엔티티 타입 : TYPE(m) = Member (상속 관계에서 사용)

타입 표현 예시
엔티티 타입 적용 예시.

JPQL 기타

  • SQL과 문법이 같은 식
  • EXISTS, IN
  • AND, OR, NOT
  • =, >, >=, <, <=, <> 
  • BETWEEN, LIKE, IS NULL

 

 

🔰 조건식

기본 CASE 범위식, 단순 CASE 정확히 일치하는 것만
 

- COALESCE 괄호 안에 지정한 필드가 null일 경우, 지정된 문자를 반환.

- NULLIF 괄호 안에 지정한 필드가 지정된 값과 같을 경우, Null 반환. 특정 필드를 보호해야 할 때 사용

 

🔰 JPQL 기본 함수

  • CONCAT = 문자열 두개를 더함 ( "select CONCAT('a' , 'b') From Member m" )
  • SUBSTRING = 자바에서 제공하는 substring() 과 같음 ( "select SUBSTRING(m.username , 2, 3) From Member m" )
  • TRIM = 공백 제거 
  • LOWER, UPPER = 대소문자로 변환
  • LENGTH = 문자의 길이
  • LOCATE = 특정 문자의 위치를 반환 / Integer ( "select LOCATE('de', 'abcdeqf') From Member m" )
  • ABS, SQRT, MOD = 수학 함수
  • SIZE, INDEX(JPA 용도) = SIZE는 컬렉션의 크기를 반환 ( "select size(t.members) From Team t" )
    INDEX는 OrderColumn을 사용할 때 index값을 반환. 

 

사용자 정의 함수

- 기본 함수에서 처리할 수 없는 로직일 때 사용.

- DB별 Dialect (방언) 에 따라 여러가지 함수가 존재. 하지만 DB에 종속적이라 사용하는 DB에 따라 함수가 다름.
- DB별로 이미 존재하는 함수를 사용자가 함수 명을 붙여서 사용하는 것. 

1. dialect라는 패키지를 따로 만들고, 클래스를 하나 생성하여 사용하는 DB의 Dialect 클래스를 상속받는다.
2. 생성자에 registerFunction 함수를 이용하여 이름과 기능을 지정한다.

 

3. DB 설정파일인 persistence.xml에 방언 값을 바꿔준다.

실제 사용시 function() 에 묶어서 사용

4. 사용자 정의 함수를 만들 때, 해당 DB의 Dialect 클래스에서 참조하여 생성하자. 

5. Hibernate H2에서 지원하는 함수와 H2에서 지원하는 함수가 달라, 해당 DB의 함수를 확인해 볼 필요가 있음.

 

 

본 게시글은 김영한님의 Inflearn 강의를 토대로 제작되었습니다.

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

728x90
반응형
저작자표시 (새창열림)
'JPA/Base' 카테고리의 다른 글
  • JPA - 중급 #2 페치 조인(Fetch Join)
  • JPA - JPQL 중급 #1 (경로 표현식)
  • JPA - JPQL 기본 #1 (파라미터 바인딩, 프로젝션 / 조회, 페이징)
  • JPA - JPQL 개요
KAispread
KAispread
개발에 관련된 학습 내용들을 기록하는 공간입니다.
기억의 정류장개발에 관련된 학습 내용들을 기록하는 공간입니다.
반응형
KAispread
기억의 정류장
KAispread
전체
오늘
어제
  • All (120)
    • Language (27)
      • Java (14)
      • JavaScript (4)
      • Principle (2)
      • Summary (7)
    • Web (10)
      • Template (4)
      • Base (6)
    • Spring (7)
    • Test (7)
    • JPA (23)
      • Spring Data JPA (9)
      • Base (14)
    • AWS (10)
    • DevOps (8)
      • Monitoring (2)
    • Database (10)
    • Algorithm (9)
    • Project (1)
    • Git (1)
    • 생각 정리 (4)
    • IDE (3)
      • eclipse (1)
      • Intellij (2)

블로그 메뉴

  • 🌈 GIthub
  • 🌎 LinkedIn
  • 📝 Notion
  • 🧑🏻‍💻 Resume

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
글쓰기 관리자
KAispread
JPA - JPQL 기본 # 2 (조인, 서브 쿼리, 타입 표현)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.