bone up/JPA
[JPQL] JPQL이란, 기본 문법과 쿼리 API, TypeQuery·Query, 결과 조회
연 록
2022. 5. 29. 22:41
728x90
JPQL이란?
JPQL(Java Persistence Query Language)의 특징
- 엔티티 객체를 조회하는 객체지향 쿼리 → 테이블이 아니라 엔티티 객체를 대상으로 퀄
- SQL을 추상화해서 특정 데이터베이스에 의존하지 않음
- 결국 SQL로 변환
JPQL의 장점
- JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않음 → 데이터베이스 방언만 변경하면 JPQL을 수정할 필요 없음
- SQL보다 간결 → 엔티티 직접 조회, 묵시적 조인, 다형성 지원
실행한 JPQL
select m
from Member as m
where m.username = 'kim'
실제 실행된 SQL
select
member.id as id,
member.age as age,
member.team_id as team,
member.name as name
from
Member member
where
member.name = 'kim'
기본 문법과 쿼리 API
persist()를 사용하면 되므로 INSERT문은 없음
select_문 :: =
select_절
from_절
[where_절]
[groupby_절]
[having_절]
[orderby_절]
update_문 :: = update_절 [where_절]
delete_문 :: = delete_절 [where_절]
select 문 주의사항
- 대소문자 구분
- 엔티티와 속성은 대소문자 구분 → Member, username은 대소문자 구문
- SELECT, FROM, AS는 구분하지 않음
- 엔티티 이름
- JPQL에서 사용한 Member는 클래스 명이 아니라 엔티티 명
- 엔티티 명은 @Entity(name="XXX")로 지정 가능
- 엔티티 명을 지정하지 않으면 클래스명을 기본값으로 사용
- 별칭은 필수
select username From Member m //잘못된 문법, username을 m.username으로 고쳐야 함
TypeQuery, Query
JPQL을 실행하려면 쿼리 객체를 만들어야 함
- 쿼리 객체에는 TypeQuery, Query가 있음
- 반환한 타입을 명확하게 지정할 수 있으면 TypeQuery
- 명확하게 지정할 수 없으면 Query
TypeQuery <Member> query = em.createQuery("select m from Member m", Member.class);
List <Member> resultList = query.getResultList();
for (Member member : resultList) {
System.out.println("membmer = " + member);
}
// 조회할 대상이 Member 엔티티로 명확 → TypeQuery
Query query = em.createQuery ("select m.username, m.age from Member m");
List resultList = query.getResultList();
for (Object o : resultList) {
Object [] result = (Object[]) o; // 결과가 둘 이상이면 Object 반환
System.out.println("username = " + reulst[0]);
System.out.println("age = " + result[1]);
}
// 조회 대상이 String 타입인 이름과 Integer 타입인 나이이므로 조회할 대상이 명확하지 않음 -> Query
결과 조회
- query.getResultList() : 결과를 예제로 반환하고 결과가 없으면 빈 컬렉션 반환
- query.getSingleResult() : 결과가 정확히 하니일 때 사용
- 결과가 없으면 javax.persistence.NoResultException 예외 발생
- 결과가 1개 보다 많으면 javax.persistence.NonUniqueResultException 예외 발생
getSingleResult()는 결과가 정확히 1개가 아니면 예외가 발생하므로 주의해야 함