Post

(JPA)JPQL 기본문법

JPQL 기본문법

JPQL(Java Persistence Query Language)?

  • JPQLEntity 2022객체 대상으로 쿼리 한다.
  • JPQL 은 특정 데이터베이스 SQL 에 의존적이지 않다.
  • JPQL 은 결국 SQL 로 변환되어 실행된다.

JPQL 문법

1
2
3
4
5
6
7
8
9
10
11
12
select_ :: =
    select_
    from_
    [where_]
    [groupby_]
    [having_]
    [orderby_]
    
update_ :: = update_ [where_]
delete_ :: = delete_ [where_]

select m from Member as m where m.age > 18
  • 엔티티와 속성은 대소문자로 구분한다.(Member, age)
  • JPQL 키워드는 대소문자를 구분하지 않는다.
  • 엔티티의 이름을 사용, 테이블 이름을 사용하는 것이 아니다.
  • 별칭은 필수(as는 생략 가능하다.)

집합과 정렬

1
2
3
4
5
6
7
8
select
    COUNT(m), // 회원 
    SUM(m),   // 나이 
    AVG(m),   // 평균 나이
    MAX(m),   // 최대 나이
    MIN(m)    // 최소 나이
from
    Member m
  • ANSI SQL 에서 지원하는 함수는 모두 사용 가능하다.

TypeQuery, Query

1
2
3
TypeQuery<Member> query = em.createQuery(
    "SELECT m FROM Member as m", Member.class
);
  • TypeQuery: 반환 타입이 명확할 때 사용
1
2
3
Query query = em.createQuery(
    "SELECT m.username, m.age FROM Member as m"
);
  • Query: 반환 타입이 명확하지 않을 때 사용
  • m.username, m.age 두 개의 속성을 반환하기 때문에 타입을 명시 할 수 없어 Query 를 사용해야 한다.

결과 조회 API

  • query.getResultList() : 결과가 하나 이상일 때 사용, 리스트로 반환
    • 결과가 없으면, 빈 리스트를 반환하기 때문에 NPE 에 대한 걱정을 하지 않아도 된다.
  • query.getSingleResult() : 결과가 정확히 하나 일때 사용, 단일 객체로 반환
    • 결과가 없으면 javax.persistence.NoResultException 발생
    • 결과가 둘 이상이면 javax.persistence.NonUniqueResultException 발생

파라미터 바인딩

1
2
3
TypedQuery<Member> query = 
    em.createQuery("select m from Member as m where m.username = :username", Member.class);
query.setParameter("username", "member1");
  • 이름 기준으로 파라미터 바인딩
1
2
3
TypedQuery<Member> query = 
    em.createQuery("select m from Member as m where m.username = ?1", Member.class);
query.setParameter(1, "member1");
  • 위치 기준으로 파라미터 바인딩

  • 왠만하면 이름 기준으로 사용하자, 위치는 변경될 가능성도 높고 직관적이지 못하다.


REFERENCE


#JPA_JPQL_기본문법

This post is licensed under CC BY 4.0 by the author.