✍JPA는 다양한 쿼리 방법을 지원.
- JPQL 은 객체지향 쿼리 언어, 따라서 엔티티 객체를 대상으로 쿼리한다.
- JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
- JPQL은 결국 SQL로 반환된다.

💦 JPQL 문법

- 기본적인 문법은 SQL과 같음.
- update 같은 경우에서 한방에 쿼리를 날리는 것을 '벌크 연산'이라고 함.
- select m from Member as m where m.age > 18
- 엔티티와 속성은 대소문자 구분O (Member, age)
- JPQL 키워드는 대소문자 구문 X (SELECT, FROM, where)
- 엔티티 이름을 사용, 테이블 이름 X
- 별칭 필수 (as는 생략 가능)

TypedQuery = 반환 타입이 명확할 때,
Query = 반환 타입이 명확하지 않을 때.

결과 조회 API

- query.getResultList() = 결과가 하나 이상일 때, List로 반환함.
=> 결과가 없으면 빈 리스트로 반환
- query.getSingleResult() = 결과가 정확히 하나 일 때, 단일 엔티티 객체로 반환함.
=> 결과가 없으면 : javax.persistence.NoResultException
=> 둘 이상이면 : javax.persistence.NonUniqueResultException
=> Spring Data JPA 에서는 결과가 없을 때 null로 반환하던가 try catch 문으로 감싸서 실행한다. => 예외에 대한 최적화.
파라미터 바인딩

엔티티 필드에 대한 파라미터를 바인딩하고 해당 파라미터에 값을 설정하여 특정 데이터를 불러올 수 있다.
💦 프로젝션
- SELECT 절에 조회할 대상을 지정하는 것.
- 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입 (숫자, 문자 등 기본 데이터 타입 - 기존 SQL에서는 이 타입만 가능)
ㆍ 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로 중복 제거.

💠 여러 값 조회 Ex. ) m.username (String) m.age (Int) 를 같이 가져올 때
- Query 사용.
- Object[] 사용.

3. 💡 new 명령어로 조회.

ㆍ단순 값을 DTO로 바로 조회.
ㆍ패키지 명을 포함한 전체 클래스명 입력
ㆍ순서와 타입이 일치하는 생성자가 필요.
💦 페이징 API (몇 번째부터 몇 개 가져올래?)
- JPA는 페이징을 다음 두 API로 추상화.
ㆍsetFirstResult (int startPosition) - 조회 시작 위치 (0부터 시작.)
ㆍsetMaxResults (int maxResult) - 조회할 데이터 수

- 페이징 전략을 짤 때, 사용하는 데이터베이스 방언 + 테이블을 보고 해당 전략에 맞는 쿼리를 생성하게 됨

본 게시글은 김영한님의 Inflearn 강의를 토대로 제작되었습니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
✍JPA는 다양한 쿼리 방법을 지원.
- JPQL 은 객체지향 쿼리 언어, 따라서 엔티티 객체를 대상으로 쿼리한다.
- JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
- JPQL은 결국 SQL로 반환된다.

💦 JPQL 문법

- 기본적인 문법은 SQL과 같음.
- update 같은 경우에서 한방에 쿼리를 날리는 것을 '벌크 연산'이라고 함.
- select m from Member as m where m.age > 18
- 엔티티와 속성은 대소문자 구분O (Member, age)
- JPQL 키워드는 대소문자 구문 X (SELECT, FROM, where)
- 엔티티 이름을 사용, 테이블 이름 X
- 별칭 필수 (as는 생략 가능)

TypedQuery = 반환 타입이 명확할 때,
Query = 반환 타입이 명확하지 않을 때.

결과 조회 API

- query.getResultList() = 결과가 하나 이상일 때, List로 반환함.
=> 결과가 없으면 빈 리스트로 반환
- query.getSingleResult() = 결과가 정확히 하나 일 때, 단일 엔티티 객체로 반환함.
=> 결과가 없으면 : javax.persistence.NoResultException
=> 둘 이상이면 : javax.persistence.NonUniqueResultException
=> Spring Data JPA 에서는 결과가 없을 때 null로 반환하던가 try catch 문으로 감싸서 실행한다. => 예외에 대한 최적화.
파라미터 바인딩

엔티티 필드에 대한 파라미터를 바인딩하고 해당 파라미터에 값을 설정하여 특정 데이터를 불러올 수 있다.
💦 프로젝션
- SELECT 절에 조회할 대상을 지정하는 것.
- 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입 (숫자, 문자 등 기본 데이터 타입 - 기존 SQL에서는 이 타입만 가능)
ㆍ 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로 중복 제거.

💠 여러 값 조회 Ex. ) m.username (String) m.age (Int) 를 같이 가져올 때
- Query 사용.
- Object[] 사용.

3. 💡 new 명령어로 조회.

ㆍ단순 값을 DTO로 바로 조회.
ㆍ패키지 명을 포함한 전체 클래스명 입력
ㆍ순서와 타입이 일치하는 생성자가 필요.
💦 페이징 API (몇 번째부터 몇 개 가져올래?)
- JPA는 페이징을 다음 두 API로 추상화.
ㆍsetFirstResult (int startPosition) - 조회 시작 위치 (0부터 시작.)
ㆍsetMaxResults (int maxResult) - 조회할 데이터 수

- 페이징 전략을 짤 때, 사용하는 데이터베이스 방언 + 테이블을 보고 해당 전략에 맞는 쿼리를 생성하게 됨

본 게시글은 김영한님의 Inflearn 강의를 토대로 제작되었습니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com