everyday_99.log
로그인
everyday_99.log
로그인
JPQL
everyday_99
·
2023년 3월 15일
팔로우
0
JPA
0
JPQL 문법
select m from Member as m where m.age > 18
엔티티와 속성은 대소문자 구분 O
JPQL 키워드는 대소문자 구분 X
엔티티 이름 사용, 테이블 이름 아님
별칭은 필수 (as는 생략 가능)
TypeQuery, Query
TypeQuery : 반환 타입이 명확할 때 사용
Query : 반환 타입이 명확하지 않을 때 사용
결과 조회 API
Query.getResultList() : 결과가 하나 이상일 때, 리스트 반환
결과가 없으면 빈 리스트 반환
Query.getSingleResult() : 결과가 정확히 하나, 단일 객체 반환
결과가 없으면 : NoResultException
둘 이상이면 : NonUniqueResultException
프로젝션
SELECT 절에 조회할 대상을 지정하는 것
프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(기본 데이터 타입)
SELECT m FROM Member m -> 엔티티 프로젝션
SELECT m.team FROM Member m -> 엔티티 프로젝션
SELECT m.address FROM Member m -> 임베디드 타입 프로젝션
SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션
DISTINCT로 중복 제거
여러 값 조회
SELECT m.username, m.age FROM Member m
Query 타입으로 조회
Object[] 타입으로 조회
New 명령어로 조회
단순 값을 DTO로 바로 조회 SELECT new ~~DTO(m.username, m.age) FROM Member m
패키지 명을 포함한 전체 클래스 명 입력
* 순서와 타입이 일치하는 생성자 필요
페이징 API
JPA는 페이징을 다음 두 API로 추상화
setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작)
setMaxResults(int maxResult) : 조회할 데이터 수
조인
내부 조인
SELECT m FROM Member m [INNER] JOIN m.team t
외부 조인
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
세타 조인
* Select count(m) from Member m, Team t where m.username = t.name
ON 절
ON절을 활용한 조인(JPA 2.1부터 지원)
조인 대상 필터링
JPQL : SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'
SQL : SELECT m.
, t.
FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A'
연관관계 없는 엔티티 외부 조인(하이버네이트 5.1부터)
JPQL : SELECT m, t FROM Member m LEFT JOIN Team t on m.username = t.name
SQL : SELECT m.
, t.
FROM Member m LEFT JOIN Team t ON m.username = t.name
서브 쿼리
서브 쿼리 지원 함수
[NOT] EXISTS (subquery): 서브쿼리에 결과가 존재하면 참
{ALL | ANY | SOME} (subquery)
ALL 모두 만족하면 참
ANY, SOME: 같은 의미, 조건을 하나라도 만족하면 참
[NOT] IN (subquery): 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참
JPA 서브 쿼리 한계
JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능
SELECT 절도 가능(하이버네이트에서 지원)
FROM 절의 서브 쿼리는 현재 JPQL에서 불가능
조인으로 풀 수 있으면 풀어서 해결
JPQL 타입 표현
문자 : ‘HELLO’, ’She’’s’
숫자 : 10L(Long), 10D(Double), 10F(Float)
Boolean : TRUE, FALSE
ENUM : jpabook.MemberType.Admin(패키지명 포함)
엔티티 타입 : TYPE(m) = Member (상속 관계에서 사용)
조건식 - CASE 식
기본 CASE식
단순 CASE식
COALESCE : 하나씩 조회해서 null이 아니면 반환
NULLIF : 두 값이 같으면 null 반환, 다르면 첫번째 값 반환
JPQL 기본 함수
CONCAT
SUBSTRING
TRIM
LOWER, UPPER
LENGTH
LOCATE
ABS, SQRT, MOD
SIZE, INDEX(JPA 용도)
사용자 정의 함수 호출
하이버네이트는 사용전 방언에 추가해야 한다.
사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한다.
everyday_99
독종
팔로우
이전 포스트
객체지향 쿼리 언어
다음 포스트
경로 표현식
0개의 댓글
댓글 작성
관련 채용 정보