Spring/QueryDSL

기본 Q-Type 활용

느리지만 꾸준하게 2022. 4. 19. 23:13

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