console.log("연록")

[JPQL] JPQL이란, 기본 문법과 쿼리 API, TypeQuery·Query, 결과 조회 본문

bone up/JPA

[JPQL] JPQL이란, 기본 문법과 쿼리 API, TypeQuery·Query, 결과 조회

연 록 2022. 5. 29. 22:41
728x90

JPQL이란?

 

JPQL(Java Persistence Query Language)의 특징

  1. 엔티티 객체를 조회하는 객체지향 쿼리  테이블이 아니라 엔티티 객체를 대상으로 퀄
  2. SQL을 추상화해서 특정 데이터베이스에 의존하지 않음
  3. 결국 SQL로 변환

 

JPQL의 장점

  1. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않음 → 데이터베이스 방언만 변경하면 JPQL을 수정할 필요 없음
  2. 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 문 주의사항

  1. 대소문자 구분
    • 엔티티와 속성은 대소문자 구분 → Member, username은 대소문자 구문
    • SELECT, FROM, AS는 구분하지 않음
  2. 엔티티 이름
    • JPQL에서 사용한 Member는 클래스 명이 아니라 엔티티 명
    • 엔티티 명은 @Entity(name="XXX")로 지정 가능
    • 엔티티 명을 지정하지 않으면 클래스명을 기본값으로 사용
  3. 별칭은 필수
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

결과 조회

 

  1. query.getResultList() : 결과를 예제로 반환하고 결과가 없으면 빈 컬렉션 반환
  2. query.getSingleResult() : 결과가 정확히 하니일 때 사용
    • 결과가 없으면 javax.persistence.NoResultException 예외 발생
    • 결과가 1개 보다 많으면 javax.persistence.NonUniqueResultException 예외 발생

 

getSingleResult()는 결과가 정확히 1개가 아니면 예외가 발생하므로 주의해야 함

'bone up > JPA' 카테고리의 다른 글

[JPQL] 파라미터 바인딩, 프로젝션  (0) 2022.05.30