반응형
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다.
기본 Q-Type 활용
Q 클래스 인스턴스를 사용하는 방법
- 별칭 직접 지정
QMember qMember = new QMember("m");
- 기본 인스턴스 사용
QMember qMember = QMember.member;
기본 인스턴스는 QMember 클래스 파일에 가보면 아래 코드로 만들어져 있는 걸 확인할 수 있다.
public static final QMember member = new QMember("member1");
저번에 작성한 테스트 코드에 적용해보자.
//QMember m = new QMember("m"); // 별칭 주는 방법
QMember m = QMember.member; // 기본 인스턴스 사용 방법
위와 같이 사용해도 되고 더 나아가 import static으로 더 짧게 사용하는 방법도 있다. 이 방법을 제일 권장한다.
import static study.querydsl.entity.QMember.member;
//... 생략
//QMember m = QMember.member;
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
실행해보면 잘 실행되는 걸 확인할 수 있다.
JPQL 쿼리 확인하기
QueryDSL은 JPQL의 Builder 역할을 한다. 즉 QueryDSL로 작성한 코드는 JPQL로 번역이 된다. 그래서 콘솔 창에 JPQL 쿼리를 보고 싶으면 따로 설정해주어야 한다.
- application.yml에 use_sql_comments 추가
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
use_sql_comments: true
설정 후 다시 테스트 코드를 실행하고 콘솔창에 찍히는 로그를 확인해보자.
/* select
member1
from
Member member1
where
member1.username = ?1 */ select
member0_.member_id as member_i1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?
위 주석문이 JPQL이다. JPQL을 보면 from Member member1을 볼 수 있다. member1은 QMember의 기본 인스턴스 이름인 member1을 그대로 가져온다. 저 부분을 변경하고 싶으면 별칭을 직접 지정해주는 방식으로 QMember로 지정해주면 된다. 별칭을 직접 주는 방식은 같은 테이블을 join 해야 할 때 이름이 같으면 안 되니까 별칭을 직접 주어서 사용하면 된다. 그 외에는 그냥 기본 인스턴스를 사용하는 방식으로 사용하자.
반응형