스프링데이터 + JPA/QueryDSL

8. Q타입

sdafdq 2023. 11. 28. 11:30
@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");
....

먼저 Q타입 사용법은

QMember m = QMember.member;
QMember m = new QMember("m") //별칭은 무조건 줘야 함.

대충 저렇게 2가지 방법이 있는데, 당연히 위에걸 선호

 

@Test
public void startQuerydsl(){
    QMember m = QMember.member;

    String usernameForFind = "member1";

    Member result = query.select(m)
            .from(m)
            .where(m.username.eq(usernameForFind))
            .fetchOne();

    assertThat(result.getUsername()).isEqualTo(usernameForFind);
}

근데 여기서 저 QMember를 static import 하면 그냥 member로 쓸 수 있음.

@Test
public void startQuerydsl(){
    String usernameForFind = "member1";

    Member result = query.select(member)
            .from(member)
            .where(member.username.eq(usernameForFind))
            .fetchOne();

    assertThat(result.getUsername()).isEqualTo(usernameForFind);
}

이거를 권장한다고 함.

 

근데 나는 개인적으로 저렇게 QMember 해 놓는게 훨씬 명시적이라 더 좋긴 함.

그리고 new 해서 새로 만들어서 쓸 때는 무조건 별칭 명시해 주라고 했는데

 

@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");

......

보면 저렇게 static으로 쓰라고 된 member도 별칭이 저렇게 되어 있음.

 

그리고, 하다보면 같은 테이블을 join해서 가져와야 할 때가 있는데,

 

그 때 new 해서 새로운 별칭 주면서 사용하면 됨.

 

 

나는 이거 필드로 넣을 듯? 그냥 명시적으로 짧게 m 같은걸로 해서 넣어놓을 듯.

 

저 별칭은 JPQL 만들 때 사용할 별칭임.

 

jpql 나가는 쿼리도 보고 싶으면,

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/./querydsl
    username: sa
    password: 1234
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
logging:
  level:
    org.hibernate.SQL: debug

spring.jpa.properties.hibernate.use_sql_comments를 true로 하면 된다.

 

그럼

/* select
    member1 
from
    Member member1 
where
    member1.username = ?1 
    and member1.age = ?2 */ select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    where
        m1_0.username=? 
        and m1_0.age=?

여기 나가는 쿼리 보여주는 거 앞에 주석으로 JPQL도 보여줌.

 

member1은 QueryDSL로 빌드한 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");
    .......

QueryDSL이 알아서 지은거임. 뭐 소문자로 엔티티명+숫자 이런 식인듯.

 

 

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

10. 결과 조회  (0) 2023.11.28
9. 검색 조건 쿼리  (0) 2023.11.28
7. JPQL vs QueryDSL  (0) 2023.11.28
6. 예제 도메인 모델  (0) 2023.11.28
5. H2 DB 설치 및 설정  (0) 2023.11.27