JPQL이란?#
SQL을 추상화한 객체 지향 쿼리 언어
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 DB 테이블 대상으로 쿼리
네이티브 SQL#
em.createNativeQuery
- JPA가 제공하는 SQL을 직접 사용
- 특정 DB에 의존적인 기능을 사용할때 (오라클 CONNECT BY 등)
기본문법#
- 엔티티와 속성은 대소문자 구분함 (키워드는 구분안함)
- 엔티티 이름 사용, 별칭(m)은 필수 as는 생략가능
Select_문 :: =
select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절]
+ update_문 :: = update_절 [where_절] + delete_문 :: = delete_절[where_절]
*COUNT, SUM, AVG *등도 사용가능
TypeQuery, Query#
TypeQuery<X>: 반환타입이 명확할때
에:em.createQuery("select m from Member m", Member.class);
Query: 명확하지 않을 때 예:em.createQuery("select m.username, m.age from Member m");
결과조회 API#
query.getResultList(): 리스트로반환
query.getSingleResult(): 결과가 정확히 하나 (없거나 많으면 에러)
파라미터 바인딩#
= :xxx를 사용
Member singleResult = em.createQuery("select m from Member m where m.username = :username ", Member.class)
.setParameter("username", "member1")
.getSingleResult();프로젝션#
Select 절에 조회할 대상을 지정 (엔티티, 임베디드, 스칼라)
Select m from Member m -> 엔티티 (Member)
select m.team From Member m -> 엔티티 (Team)
select m.address From Member m -> 임베디드
select m.username, m.age From Member m -> 스칼라
Select m.username, m.age From Member m같이 여러 값을 가져온다면?
(거의안쓸듯)Object[]로 반환되는 값을 사용하는 방법- new 명령어로 조회
List<MemberDTO> resultList = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member m ",
MemberDTO.class)
.getResultList();패키지가 길어지는 문제가있으나 QueryDsl등에서 해결 가능
페이징#
페이징을 두 API로 추상화
setFirstResult(int startPosition): 조회시작위치setMaxResults(int maxResult): 조회할 데이터 수 웬만한 DB에 다 맞게 지원됨