Q클래스 인스턴스를 사용하는 2가지 방법

  1. 별칭 직접 지정 (DB의 별칭 의미)

    참고

    QMember qMember = new QMember("m");
    
  2. 기본 인스턴스 사용

    QMember qMember = QMember.member;
    

기본 인스턴스를 static import와 함께 사용

import static study.querydsl.entity.QMember.member; //...1

@SpringBootTest
@Transactional
public class QuerydslBasicTest {

    @PersistenceContext
    EntityManager em;

    JPAQueryFactory queryFactory;

    @BeforeEach
    void setUp() {
        queryFactory = new JPAQueryFactory(em);

        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");
        em.persist(teamA);
        em.persist(teamB);

        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 20, teamA);
        Member member3 = new Member("member3", 30, teamB);
        Member member4 = new Member("member4", 40, teamB);
        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);
    }

    @Test
    void startQuerydslStaticImport() {
        Member findMember = queryFactory
                .select(member) //...1
                .from(member) //...1
                .where(member.username.eq("member1"))
                .fetchOne();

        assertThat(findMember.getUsername()).isEqualTo("member1");
    }

}
  1. static import 를 하게 되면 깔끔해져 가독성이 좋아집니다. 그래서 이렇게 사용하는 걸 권장합니다.

QueryDsl 실행시 JPQL을 확인하기

QueryDsl 은 결국 JPQL 의 빌더 역할을 합니다. 결과적으로 QueryDsl 을 작성한 코드는 JPQL 로 변환된다고 보면 됩니다.

만약 SQL 말고 실행되는 JPQL 을 보고 싶으면 아래의 프로퍼티를 추가해야 합니다.

spring:
  jpa:
	  properties:
	    hibernate:
	        use_sql_comments: true

테스트 코드를 실행하면 JPQL 이 주석으로 생성된 것을 볼 수 있습니다. 이후에는 SQL이 보이구요.

Untitled

쿼리를 보면 alias 가 member1 로 생성된 것을 볼 수 있는데요, QueryDsl 자체에서 member1 로 만들어서 그렇습니다.

Untitled

별칭을 사용해서 Q클래스 인스턴스를 생성한다면?