[Spring] JPQL 기초 (3)

이연우·2025년 8월 20일

TIL

목록 보기
97/100

🔗 JOIN(조인)이란?

  • JPQL의 JOIN은 엔티티 간의 관계를 연결/필터링(ON) 하는 기능
  • Hibernate 5.1 이상 → 연관관계 없는 엔티티도 JOIN 가능

📌 JOIN ON (연관관계 없는 엔티티 조인)

String query = "select t from Tutor t left join Subject s on t.name = s.name";
List<Tutor> tutorList = em.createQuery(query, Tutor.class).getResultList();
  • TutorSubject는 직접적인 관계 없음
  • ON 조건으로 조인 가능

✅ 특징

  • 관계 없는 엔티티도 연결 가능
  • SQL과 거의 동일한 JOIN 문법 지원

🧮 CASE (조건식)이란?

  • 조건에 따라 다른 값을 반환하는 표현식
  • SQL CASE 구문과 유사

💡 추가 함수

  • COALESCE(a, b) → a가 null 아니면 a, null이면 b 반환
  • NULLIF(a, b) → a=b면 null, 다르면 a 반환

📌 조건식 CASE 예시

String query =
  "select case when t.age < 10 then '어린이' " +
  "when t.age >= 80 then '노약자' " +
  "else '청년' end " +
  "from Tutor t";

List<String> resultList = em.createQuery(query, String.class).getResultList();

✅ 특징

  • 나이에 따라 "어린이", "노약자", "청년" 분류
  • SQL과 동일한 문법으로 사용 가능

🛠️ 함수 (Functions)란?

  • JPQL은 SQL과 유사하게 문자열/숫자/날짜 등 다양한 내장 함수 제공
  • 💡 사용자 정의 함수도 등록 가능

🔡 문자열 함수

  1. CONCAT('a','b') → 문자열 합치기
  2. SUBSTRING('abcde',2,3) → 2번째부터 3글자 "bcd"
  3. TRIM(' a ') → 앞뒤 공백 제거 "a"
  4. LOWER('A'), UPPER('a') → 소문자/대문자 변환
  5. LENGTH('abc') → 문자열 길이 반환

🔢 숫자/컬렉션 함수

  • ABS(-100) → 절대값 = 100
  • MOD(100, 2) → 나머지 = 0
  • SIZE(t.company) → 연관된 컬렉션 크기

📄 예시 코드:

String concatQuery = "select concat(t.name, ' is good') from Tutor t";
String substringQuery = "select substring(t.name, 2, 3) from Tutor t";
String trimQuery = "select trim(t.name) from Tutor t";
String upperQuery = "select upper(t.name) from Tutor t";
String lengthQuery = "select length(t.name) from Tutor t";

✅ 실행 결과

  • "wonuk is good"
  • "onu"
  • "wonukgap" (공백 제거)
  • "WONUK" (대문자 변환)
  • 5 (길이)

🧠 요약 정리

구분핵심 내용예시
JOIN (ON)Hibernate 5.1+
연관관계 없는 엔티티도 JOIN 가능
select t from Tutor t left join Subject s on t.name = s.name
CASE조건에 따라 다른 값 반환 (SQL CASE와 동일)case when t.age < 10 then '어린이' when t.age >= 80 then '노약자' else '청년' end
COALESCEnull이면 대체값 반환coalesce(t.name, '이름없음')
NULLIF두 값이 같으면 null, 다르면 첫 값 반환nullif(t.name, 'guest')
문자열 함수concat(문자열 합치기), substring(부분 문자열), trim(공백 제거), lower/upper(대소문자 변환), length(문자열 길이)select concat(t.name, ' hi') from Tutor t
숫자 함수abs(절대값), mod(나머지 계산)select mod(100, 2) from Tutor t
컬렉션 함수size(컬렉션) → 연관된 컬렉션 크기 반환select size(t.company) from Tutor t

0개의 댓글