- 객체지향 쿼리 언어 소개
- JPQL
- 기본 문법과 기능
- 페치 조인
1. 객체지향 쿼리 언어 소개
JPQl, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 직접 사용, MyBati, SpringJdbcTemplate 함께 사용
→ 복잡한 쿼리를 짤 수 있어야 한다는 것에서 시작
2. JPQL
1. JPQL
- 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리(=객체지향SQL)(SQL은 데이터베이스 테이블을 대상으로 쿼리)
- JPQL을 짜면, 결국에는 SQL로 번역이 되어서 실행이 됨
2. Criteria
- 위의 JPQL은 결국 String 이라서 동적 쿼리를 날리기가 어려움(string끼기 띄워쓰기 등을 고려해서 붙일때 발생하는 여러가지 문제)
- 그래서 나온것이 Criteria
- 쿼리를 코드로 짜는 것
- 쉬운거 같으면서 어려움(sql같은거는 조금 더 직관적인데, 이거는 조금 혼란스러움)
- 동적 쿼리로 짜기가 좋다.
- Java코드라서 에러를 바로 확인 가능
- 결론
→ 실무에서 안씀(못 알아보겠어서, 유지보수가 안됨
→ 그냥 이런게 있구나 정도
→ Criteria 대신에 Query DSL 사용 권장
3. QueryDSL
- 문자가 아닌 자바코드로 JPQL을 작성할 수 있음
- JPQL 빌더 역할
- 컴파일 시점에 문법 오류를 찾을 수 있음
- 동적쿼리 작성 편리함
- 단순하고 쉬움
- 실무 사용 권장
4. 네이티브 SQL
- JPA가 제공하는 SQL을 직접 사용하는 기능
- JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
5. 결론
JPQL과 QueryDSL을 잘 사용하자
3. 기본 문법과 기능
1. JPQL 문법
- 엔티티와 속성은 대소문자 구분함(Member, age)
- JPQL 키워드는 대소문자 구분 못함(SELECT, FROM, where)
- 엔티티 이름 사용, 테이블 이름이 아님(Member)
- 별칭은 필수(m)(as는 생략 가능)
2. TypeQuery, Query
- TypeQuery : 반환 타입이 명확할 때 사용
- Query : 반환 타입이 명확하지 않을 때 사용
3. 결과 조회 API
- query.getResultList() : 결과가 하나 이상일 때. 리스트 반환 → 결과가 없으면 빈 리스트 반환
- query.getSingleResult() : 결과가 정확히 하나. 단일 객체 반환 → 결과가 없거나, 둘 이상이면 exception 남
4. 파라미터 바인딩
(1) 이름 기준(이거 쓰기)
SELECT m FROM Member m where m.username=:username
query.setParameter("username", usernameParam);
(2) 위치 기준
SELECT m FROM Member m where m.username=?1
query.setParameter(1, usernameParam);
- 중간에 하나 끼워넣으면 순서가 밀리는 이유때문에, 이거 쓰지말기
5. 페이징 API
- JPA는 페이징을 다음 두 API로 추상화
- setFirstResult(int stratPosition) : 조회 시작 위치(0부터 시작)
- setMaxResults(int maxResult) : 조회할 데이터 수
4. 페치 조인
1. 내부조인
- 멤버는 있고 팀이 없는경우, 데이터가 아예 안 나옴
SELECT m FROM Member m [INNER] JOIN m.team t
2. 외부조인
- 멤버는 있고 팀이 없는경우, 팀 데이터는 다 널이고 멤버는 조회가 됨
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
3. 서브쿼리
- JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능
- FROM 절의 서브 쿼리는 현재 JPQL에서 불가능
→ 해결책1. 조인으로 풀어서 해결
→ 해결책2. 쿼리를 두번 날리기
이 글은 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 정리한 내용입니다.