본문 바로가기
웹개발/JPA

JPQL

by 철없는민물장어 2023. 7. 22.
728x90

JPQL(Java Persistence Query Language)

 

기본 문법과 기능

JPQL은 엔티티 객체를 대상으로 쿼리한다.

JPQL은 SQL로 변환된다.

 

select m from Member as m wehere m.age > 18

기본적인 문법은 SQL과 거의 동일하다.

 

유의할 점

- 엔티티와 속성은 대소문자를 구분한다.

- 테이블 이름이 아닌 엔티티 이름을 사용한다.

- 별칭이 필수이다.

 


TypeQuery: 반환 타입이 명확할 때

Query: 반환 타입이 명확하지 않을 때 

            TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
            TypedQuery<String> query1 = em.createQuery("select m.username from Member m", String.class);
            Query query2 = em.createQuery("select m.username, m.age from Member m");

createQuery의 두번째 인자로 타입을 줄 수 있다.

위 코드에서 query, query1은 반환타입이 명확하지만 query2의 경우에는 username과 age를 가져와야하니 타입을 정할 수 없다. 

 

결과 조회

            TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);

            List<Member> resultList = query.getResultList();
            Member singleResult = query.getSingleResult();
  • getResultList()
  • getSingleResult()

query.getResultList()메소드를 이용하면 컬렉션을 반환받을 수 있다. 결과가 없으면 빈 리스트를 반환한다.

query.getSingleResult()메소드를 이용하면 하나의 결과를 반환받을 수 있다. 그런데, 결과가 없거나 결과가 2개 이상인 경우 예외가 발생하니 주의해야한다.


파라미터 지정

            TypedQuery<Member> query = em.createQuery("select m from Member m where m.username = :username", Member.class);
            query.setParameter("username","member1");

쿼리에 :파라미터명을 적어주고 setParameter로 파라미터 값을 지정하면 된다.


프로젝션

SELECT절에 조회할 대상을 지정하는것

프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)

 

SELECT m FROM Member m -> 엔티티 프로젝션

SELECT m.team FROM Member m -> 엔티티 프로젝션(결과가 team엔티티. 내부적으로 team을 join함.)

SELECT m.address FROM Member m ->임베디드 타입 프로젝션

SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션

 

이렇게 조회한 결과는 모두 영속성 컨텍스트에 들어가기때문에 변경이 발생하면 커밋시에 자동으로 변경내용이 저장된다.

 

List<MemberDTO> result = em.createQuery("select new ..(패키지명을 포함).MemberDTO(m.username,m.age) from Member m",MemberDTO.Class).getResultList();

여러 값을 가져올 때는, DTO클래스를 만들어서 받는것이 깔끔하다.

이때 select절에는 new {패키지명을 포함한 클래스명}({속성1},{속성2}) 처럼 작성해야한다.

(DTO에 생성자가 있어야 한다.)


페이징

JPA는 페이징을 다음 두 API로 추상화한다.

  • setFirstResult(int startPosition): 조회 시작 위치
  • setMaxResults(int maxResult): 조회할 데이터 수
            List<Member> resultList = em.createQuery("select m from Member m order by m.age desc", Member.class)
                    .setFirstResult(0)
                    .setMaxResults(10)
                    .getResultList();

위 예시를 실행하고, 결과를 출력해보면..

이렇게 age 내림차순으로 정렬된 순서에서 0번째부터 10개의 member가 조회된 것을 볼 수 있다.

728x90

'웹개발 > JPA' 카테고리의 다른 글

JPA가 지원하는 다양한 쿼리 방법  (0) 2023.07.22
값 타입  (0) 2023.07.19
영속성 전이 CASCADE  (0) 2023.07.19
즉시 로딩과 지연 로딩  (0) 2023.07.16
프록시  (0) 2023.07.14

댓글