(JPA)JPQL 기본문법
JPQL 기본문법
JPQL(Java Persistence Query Language)?
JPQL
은Entity
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.