JPQL로 조회하기

2369 단어 JPQLJPAJPA

참고

  1. JPA 프로그래밍(김영한 저)
  2. spring jpa에서 @Query 사용하는 방법

예시로 사용한 DB 샘플
(category_id는 무시)

작성한 엔티티

배경

  • JPA는 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 제공
  • ORM을 사용하면 DB 테이블이 아닌 엔티티 객체를 직접적으로 다루기 때문에 검색도 테이블이 아닌 객체를 대상으로 하는 방법이 필요

JPQL

JPQL(Java Persistence Query Language)은

  1. 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
  2. SQL을 추상화해서 특정 DB SQL에 의존하지 않음
    하지만 native SQL을 사용할 수도 있음
  3. JPQL은 결국 SQL로 변환됨

기본 SELECT

  • 여기서 Product는 DB의 테이블 이름이 아니라 객체의 엔티티 이름.
    (클래스명이 아닌 엔티티명이지만 엔티티 설정 시 따로 설정해주지 않으면 클래스명이 엔티티명이 됨)
  • 속성 이름도 DB의 테이블 컬럼명이 아니라 객체의 속성이름이다.
  • alias는 필수이다. (Product AS prod 부분, AS 생략 가능)
  • jdbc template에서 =:로 파라미터를 바인딩하는 것과 비슷하게 :keyword로 파라미터를 바인딩하는 방식이 익숙하다.

필요한 속성들만 조회하는 예시

repository에 정의한 쿼리

사용 예시

JPQL 조인 예시

  • JPQL에서 조인도 역시 객체를 대상으로 함
    JOIN에 외래키를 명시하지 않고 연관관계를 설정한 멤버 변수를 명시함

  • 실제로 실행된 쿼리
    실제 쿼리에선 일반적인 SQL에서와 동일하게 외래키를 이용해서 join을 하는 것을 볼 수 있다

    Hibernate:
    select displayinf0_.id as id1_1_, displayinf0_.create_date as create_d2_1_, displayinf0_.email as email3_1_, displayinf0_.homepage as homepage4_1_, displayinf0_.modify_date as modify_d5_1_, displayinf0_.opening_hours as opening_6_1_, displayinf0_.place_lot as place_lo7_1_, displayinf0_.place_name as place_na8_1_, displayinf0_.place_street as place_st9_1_, displayinf0_.product_id as product11_1_, displayinf0_.tel as tel10_1_
    from display_info displayinf0_
    inner join product product1_ on displayinf0_.product_id=product1_.id
    where displayinf0_.product_id=?

좋은 웹페이지 즐겨찾기