Q 클래스를 사용하는 방법에는 두 가지 방법이 있다.
Q Member로 가보면 아래와 같이 new QMember이 나와있는데 쓰면 된다.
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QMember extends EntityPathBase<Member> {
private static final long serialVersionUID = -769675599L;
private static final PathInits INITS = PathInits.DIRECT2;
public static final QMember member = new QMember("member1");
@Test
public void startQuerydsl() {
// 어떤 Q 멤버인지 이름을 주는 것
QMember m = QMember.member;
// JPQL과 똑같다.
Member findMember = queryFactory
.select(m)
.from(m)
// 파라미터 바인딩을 안해도 eq를 해서 자동으로 JDBC의 prepare stament로 파라미터로 바인딩을 자동으로 한다.
.where(m.username.eq("member1")) // 파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
한번 더 줄일 수 있는 방법이 있는데
static import를 써보면 아래와 같이 깔끔해진다.
@Test
public void startQuerydsl() {
// 이렇게 static member를 이용해서 깔끔하게 쓸 수 있다.
// querydsl은 JPQL의 builder 역할을 하는데 즉 querydsl로 작성한 코드는 JPQL이 된다고 보면된다.
Member findMember = queryFactory
.select(member)
.from(member)
// 파라미터 바인딩을 안해도 eq를 해서 자동으로 JDBC의 prepare stament로 파라미터로 바인딩을 자동으로 한다.
.where(member.username.eq("member1")) // 파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
실행이 잘되고 쿼리도 정상적으로 나온다.
select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?
select member0_.id as id1_1_, member0_.age as age2_1_, member0_.team_id as team_id4_1_, member0_.username as username3_1_ from member member0_ where member0_.username=?
select member0_.id as id1_1_, member0_.age as age2_1_, member0_.team_id as team_id4_1_, member0_.username as username3_1_ from member member0_ where member0_.username='member1';
application.yml에다가 use_sql_comments 구문을 넣어서 JPQL 구문이 보일수가 있다.
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_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?
/* select member1
from Member member1
where member1.username = ?1 */ select member0_.id as id1_1_, member0_.age as age2_1_, member0_.team_id as team_id4_1_, member0_.username as username3_1_ from member member0_ where member0_.username=?
/* select member1
from Member member1
where member1.username = 'member1'1 */ select member0_.id as id1_1_, member0_.age as age2_1_, member0_.team_id as team_id4_1_, member0_.username as username3_1_ from member member0_ where member0_.username=NULL;
member1이라고 나오는 이유는 QMember에서 만들때 member1으로 지정해줬기 때문이다.
그리고 JPQL의 alias를 m1으로 바꿀 수가 있다.(같은 테이블을 join할 경우에만 선언해서 쓰면 된다.)
@Test
public void startQuerydsl() {
// 이렇게 static member를 이용해서 깔끔하게 쓸 수 있다.
// querydsl은 JPQL의 builder 역할을 하는데 즉 querydsl로 작성한 코드는 JPQL이 된다고 보면된다.
// 같은 테이블을 조인할 때 이름이 같으면 안되니까 alias를 이렇게 선언해서 쓴다.
QMember m1 = new QMember("m1");
Member findMember = queryFactory
.select(m1)
.from(m1)
// 파라미터 바인딩을 안해도 eq를 해서 자동으로 JDBC의 prepare stament로 파라미터로 바인딩을 자동으로 한다.
.where(m1.username.eq("member1")) // 파라미터 바인딩 처리
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
/* select
m1
from
Member m1
where
m1.username = ?1 */ select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?
<출처 김영한: 실전! Querydsl >
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
실전! Querydsl - 인프런 | 강의
Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...
www.inflearn.com
'Spring > QueryDSL' 카테고리의 다른 글
결과 조회 (0) | 2022.04.20 |
---|---|
검색 조건 쿼리 (0) | 2022.04.19 |
JPQL vs Querydsl (0) | 2022.04.19 |
예제 도메인 모델 동작확인 (0) | 2022.04.19 |
스프링 부트 설정 - JPA, DB (0) | 2022.04.19 |