객체지향 쿼리언어-1

최연재·2022년 7월 20일
0

JPA

목록 보기
10/11
    1. 객체지향 쿼리 언어 소개
    1. JPQL
    1. 기본 문법과 기능
    1. 페치 조인

1. 객체지향 쿼리 언어 소개

JPQl, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 직접 사용, MyBati, SpringJdbcTemplate 함께 사용
\to 복잡한 쿼리를 짤 수 있어야 한다는 것에서 시작

2. JPQL

1. JPQL

  • 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리(=객체지향SQL)(SQL은 데이터베이스 테이블을 대상으로 쿼리)
  • JPQL을 짜면, 결국에는 SQL로 번역이 되어서 실행이 됨

2. Criteria

  • 위의 JPQL은 결국 String 이라서 동적 쿼리를 날리기가 어려움(string끼기 띄워쓰기 등을 고려해서 붙일때 발생하는 여러가지 문제)
  • 그래서 나온것이 Criteria
  • 쿼리를 코드로 짜는 것
  • 쉬운거 같으면서 어려움(sql같은거는 조금 더 직관적인데, 이거는 조금 혼란스러움)
  • 동적 쿼리로 짜기가 좋다.
  • Java코드라서 에러를 바로 확인 가능
  • 결론
    \to 실무에서 안씀(못 알아보겠어서, 유지보수가 안됨
    \to 그냥 이런게 있구나 정도
    \to 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() : 결과가 하나 이상일 때. 리스트 반환 \to 결과가 없으면 빈 리스트 반환
  • query.getSingleResult() : 결과가 정확히 하나. 단일 객체 반환 \to 결과가 없거나, 둘 이상이면 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에서 불가능
    \to 해결책1. 조인으로 풀어서 해결
    \to 해결책2. 쿼리를 두번 날리기

이 글은 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 정리한 내용입니다.

profile
가보자고

0개의 댓글