Skip to main content

JPQL-기본1

·239 words·2 mins· loading
Table of Contents
JPA - This article is part of a series.
Part 9: This Article

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에 다 맞게 지원됨
JPA - This article is part of a series.
Part 9: This Article