JPQL로 조회하기
참고
- JPA 프로그래밍(김영한 저)
- spring jpa에서 @Query 사용하는 방법
예시로 사용한 DB 샘플
(category_id는 무시)
작성한 엔티티
배경
- JPA는 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 제공
- ORM을 사용하면 DB 테이블이 아닌 엔티티 객체를 직접적으로 다루기 때문에 검색도 테이블이 아닌 객체를 대상으로 하는 방법이 필요
JPQL
JPQL(Java Persistence Query Language)은
- 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
- SQL을 추상화해서 특정 DB SQL에 의존하지 않음
하지만 native SQL을 사용할 수도 있음 - 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=?
Author And Source
이 문제에 관하여(JPQL로 조회하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@g00dluckroon/객체지향-쿼리-언어저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)