<TIL> 129. JPQL? / fetch join?

YUJIN LEE·2023년 7월 2일
0

개발log

목록 보기
120/149

JPQL(Java Persistence Query Language)?

엔티티 객체를 조회하는 객체지향 쿼리.

테이블 대상으로 쿼리하는게 아닌, 엔티티 객체를 대상으로 쿼리.

JPQL은 SQL로 변환됨.

JPA에서 제공하는 메소드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제에서 JPQL 탄생.

JPQL 특징

  1. 대소문자 구분
    • 엔티티와 속성은 대소문자 구분(엔티티 이름 Member / 엔티티 Member 속성 name)
    • SELECT, FROM, AS 같은 JPQL 키워드는 대소문자 구분X
  2. 엔티티 이름
    • JPQL에서 사용한 Member는 클래스 이름이 아닌 엔티티 이름.
      엔티티 이름은 @Entity(name = "Member")로 설정 가능하다.
      name 속성을 생략하면 기본값으로 클래스 이름 사용.
  3. 별칭
    • JPQL에서 엔티티의 별칭 필수 명시.
    • 별칭을 명시하는 AS 키워드는 생략 가능

TypedQuery, Query

JPQL을 실행하려면 쿼리 객체 생성해야함.
쿼리 객체 - TypedQuery, Query

TypedQuery - 반환할 타입을 명확히 지정 가능

public static void typedQuery(EntityManager em) {
	String jpql = "select m form Member m " 
    TypedQuery<Member> query = em.createQuery(jpql, Member.class);
    
    List<Member> list = query.getResultList(); 
    for(Member member : list) {
    	System.out.println("Member  : " + member);
        }
    }

-> EntityManager 객체에서 createQuery() 메소드를 호출 시 쿼리 생성
em.createQuery 메소드를 호출 시 두번째 인자로 엔티티 클래스 넘김.

Query - 반환할 타입 명확히 지정 불가능

public static void query(EntityManager em) {
	String jpql = "select m.name, m.age from Member m";
    Query query = em.createQuery(jpql);
    
    List<Object> list = query.getResultList();
    
    for(Object object : list) {
    	Object[] results = (Object[]) object;
        
        for(Object result : results) {
        	System.out.print(result);
        }
        System.out.println();
        }
    
   }
        

-> Query 타입은 데이텉 검색 결과의 타입 명시 X

두 코드의 치아는 쿼리 객체의 타입의 차이가 있다.
TypedQuery<Member 를 사용시 쿼리 실행 결과를 명시적으로 Member 엔티티 객체로 받을 수 있어 형변환이 필요하지 않다.
결과 리스트를 바로 List<Member 로 받고, for each 루프에서 바로
Member 객체를 바로 출력할 수 있다.

Query 객체를 생성한 것은, 반환된 결과를 형변환해서 사용해야한다.

fetch join

JPQL에서 성능 최적화를 위해 제공하는 기능.

연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능
join fetch 명령어로 사용.

패치조인을 사용하면 SQL 한 번으로 연관된 엔티티를 함께 조회할 수 있어 SQL 호출 횟수를 줄여 성능 최적화 가능

profile
인정받는 개발자가 되고싶습니다.

0개의 댓글