1. JPQL
- 엔티티 객체 대상으로 하는 객체지향 쿼리 언어다.
- 특정 SQL에 의존하지 않는다.
TypeQuery : 반환 타입이 명확할 때 사용
TypedQuery<Member> typedQuery = em.createQuery("select m from Member m", Member.class);
Query : 반환 타입이 명확하지 않을 때 사용
Query query = em.createQuery("select m.username, m.age from Member m");
결과 조회
- Collection 인 경우, getResultList();
- 결과가 없으면 빈 리스트 반환 (NPE 발생하지 않음)
List<Member> members = em.createQuery("select m from Member m", Member.class)
.getResultList();
- 한개인 경우, getSingleResult();
- 결과가 정확하게 하나여야 한다.
- 결과가 없으면 NoResultException
- 둘 이상이면 NonUniqueResultException
- 결과가 정확하게 하나여야 한다.
Member findMember = em.createQuery("select m from Member m where m.id = :id", Member.class)
.setParameter("id", 1)
.getSingleResult();
파라미터 바인딩
- :column 을 정의한 뒤, setParameter 사용
TypedQuery<Member> query = em.createQuery("select m from Member m where m.username = :username", Member.class);
query.setParameter("username", "member1");
query.getSingleResult();
2. 프로젝션
- SELECT 절에 조회할 대상을 지정하는 것을 말한다.
- 가능한 대상은
- Entity
- Embedded Type
- 스칼라 타입
엔티티 프로젝션
- ex)
- SELECT m FROM Member m
- SELECT t FROM Member m join m.team t
- 엔티티 프로젝션을 한 대상은 모두 영속성 컨텍스트에서 관리된다.
스칼라 타입 프로젝션 3가지 방법
1. Query 타입 조회
List resultList = em.createQuery("select m.username, m.id from Member m")
.getResultList();
Object[] result = (Object[]) resultList.get(0);
System.out.println("result[0] = " + result[0]); // username
System.out.println("result[1] = " + result[1]); // id
2. Object[] 타입 조회
List<Object[]> resultList = em.createQuery("select m.username, m.id from Member m")
.getResultList();
Object[] result = resultList.get(0);
System.out.println("result[0] = " + result[0]); // username
System.out.println("result[1] = " + result[1]); // id
3. new 명령어로 조회 (DTO 사용)
- 생성자 형식으로 받아오기 때문에 new FullpackageClassname() 을 사용하는 것이 불편함
List<MemberDTO> resultList = em.createQuery("select new jpql.MemberDTO(m.id, m.username) from Member m", MemberDTO.class)
.getResultList();
MemberDTO result = resultList.get(0);
System.out.println("result[0] = " + result.getUsername()); // username
System.out.println("result[1] = " + result.getId()); // id
3. 페이징
- JPA 는 페이징을 아래의 두개의 API로 추상화한다.
- setFirstResult(int startPosition) : 조회 시작 위치
- setMaxResults(int maxResult) : 시작 위치부터 조회할 데이터 수
페이징에서는 order by 가 꼭 들어가야 한다.
List<Member> resultList = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
4. 조인
- 내부 조인
- 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 절
- 조인 대상을 사전에 필터링
- 연관관계 없는 엔티티 외부 조인을 지원한다.
5. 서브 쿼리
- exists : 서브쿼리에 결과가 존재하면 참
- ALL : 모두 만족하면 참
- ANY, SOME : 조건을 하나라도 만족하면 참
- IN
FROM 에서는 서브쿼리가 불가능하다.
- JPA 는 WHERE, HAVING 에서만 가능
- Hibernate 는 SELECT 절에서도 가능
- FROM 절의 서브쿼리는 JPQL 에서 불가능
6. 타입 표현
- 문자 : single quotation
- 숫자 : 10L(Long)
- Boolean : TRUE, FALSE
- ENUM : Full package name 혹은 parameter로 set
- 타입 (상속관계 시) : TYPE(m) = ?
- EXISTS, IN
- AND, OR, NOT
- =, >, >=, <, <=, <>
- BETWEEN, LIKE, IS (not) NULL
7. CASE
case when age < 10 then '미만'
when age >= 10 then '이상'
else '다 아니면 이거로'
end
COALESCE : 하나씩 조회해서 null 이 아니면 반환
- 이름이 없으면 이름 없는 회원 반환
String query =
"select coalesce(m.username, '이름 없는 회원') from Member m";
NULLIF : 같으면 null 반환, 없으면 첫번째 값 반환
String query =
"select nullif(m.username, '이름 없는 회원') from Member m";
8. JPQL 기본 함수
- CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LENGTH, LOCATE, ABS, SQRT, MOD, SIZE, INDEX
'강의 정리 > 자바 ORM 표준 JPA' 카테고리의 다른 글
10. 중급 문법 (0) | 2021.01.02 |
---|---|
8. 값 타입 (0) | 2021.01.01 |
7. 프록시와 연관관계 관리 (0) | 2021.01.01 |
6. 고급 매핑 (0) | 2020.12.29 |
5. 다양한 연관관계 매핑 (0) | 2020.12.28 |