JPQL
JPQL
가장 단순한 조회 방법
- EntityManager.find()
- 객체 그래프 탐색(a.getB().getC())
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
JPQL은 엔티티 객체를 대상으로 쿼리
SQL은 데이터베이스 테이블을 대상으로 쿼리
JPQL은 SQL을 추상화 해서 특정데이터베이스 SQL에 의존하지 않는다.
기본 문법
TypeQuery, Query
TypeQuery: 반환 타입이 명확 할때
Query: 반환 타입이 명확하지 않을 때
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class); // 객체 타입으로
TypedQuery<String> query1 = em.createQuery("select m.username from Member m", String.class); //타입이 명확
Query query2 = em.createQuery("select m.username, m.age from Member m"); // 반환 타입이 섞여 있음ㄹ
결과 조회 API
query.getResultList(): 결과가 하나 이상일 때, 없으면 빈 리스트 반환
query.getSingleResult(): 결과가 정확히 하나, 단일 객체
- 결과가 하나가 아닐 때 에러 발생
파라미터 바인딩
- 쿼리에 작성되는 특정 속성을 매개 변수로 매핑
이름 기반 바인딩
Query query = em.createQuery("select m from Member m where m.username =: username")
.setParameter("username", usernameParam);
- =: 연산자 사용
프로젝션
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 -> 스칼라 타입 프로젝션
Q. 프로젝션 스칼라 타입을 어떻게 매핑시켜야하나?
List resultList= em.createQuery("select m.username, m.age from Member m")
.getResultList();
Object o=resultList.get(0);
// username = member1
Object[] result=(Object[]) o;
// age=10
System.out.println("username = " + result[0]);
// username = member1
System.out.println("age = " + result[1]);
// age=10
Query 타입으로 조회하는 방법
Object[] 타입으로 조회하는 방법
new 명령어로 조회하는 방법
페이징 처리
어디서부터 어디까지 데이터를 가져올때 사용
//페이징 쿼리
String jpql = "select m from Member m order by m.name desc";
List<Member> resultList = em.createQuery(jpql, Member.class)
.setFirstResult(10)
.setMaxResults(20)
.getResultList();조
조인
- 내부 조인 ( inner join )
- 교집합 개념
- 외부 조인
- Left Outer join 과 Right Outer join으로 나뉨
- Left Outer join 을 예시로
- A와 B 가 존재할때
- A의 차집합과 B와 A의 교집합을 가져옴
- 세타 조인
조인 - ON 절
- 조인 대상 필터링
- 연관 관계 없는 엔티티 외부 조인
서브 쿼리
- 나이가 평균보다 많은 회원
-
select m from Member m
where m.age > (select avg(m2.age) from Member m2)
서브 쿼리가 원 쿼리의 객체와 다름
달라야 성능상 이점이 존재
-
서브쿼리 지원 함수
[NOT] EXISTS: 서브쿼리에 결과가 존재하면 참
JPA 서브 쿼리 한계
JPA는 where,having 절에서만 서브 쿼리 사용가능
select 절도 가능
select (select m1 From Member m1) from Member m ..
From 절의 서브 쿼리는 JPQL에서 불가능
JPQL 타입
문자: ‘HELLO’, ‘She”s’
숫자: 10L(Long), 10D (Double), 10F (Float)
Boolean: TRUE, FALSE
ENUM: jpabook.MemberType.Admin (패키지명 포함)
엔티티 타입: TYPE(m) =Member