2024.11.17 - [QueryDSL] - [JPA활용] JPQL vs Querydsl - assertThat() 사용법
저번 글에 이어 이번 글은 Q-Type 활용 방법이다.
먼저, 저번에 작성했던 Test 코드를 보겠다!
반응형
✅ Q클래스 인스턴스를 사용하는 2가지 방법
1. 별칭 직접 지정
package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;
import study.querydsl.entity.QMember;
import study.querydsl.entity.Team;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Test
public void startQuerydsl(){
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m"); // 별칭 직접 지정
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
위 코드는 저번에 작성했던 코드와 일치하다.
다른 점은 Q타입에 주석을 추가해줬다!
그 이유는 주석으로 설명을 추가한 코드가 다른 방식으로도 쓸 수 있기 때문이다.
2. 기본 인스턴스 사용
package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;
import study.querydsl.entity.QMember;
import study.querydsl.entity.Team;
import static org.assertj.core.api.Assertions.assertThat;
import static study.querydsl.entity.QMember.*;
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Test
public void startQuerydsl(){
// QMember m = new QMember("m"); // 별칭 직접 지정
QMember qMember = QMember.member; //기본 인스턴스 사용
Member findMember = queryFactory
.select(qMember)
.from(qMember)
.where(qMember.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
이렇게 별칭을 지정하지 않고, 바로 기본 인스턴스를 사용하여 적용할 수도 있다.
어차피 기본 인스턴스를 사용하므로 굳이 선언을 하지 않겠다? 해서 queryFactory에 바로 QMember.member을 다 집어넣어도 된다. 하지만 그렇게 하면 조금 지저분해 보이므로, static import를 이용해서 간단하게 작성할 수도 있다.
이 부분은 저번 글에 올린 assertThat() 을 바로 사용하는 것과 비슷한 개념같다.
728x90
3. 기본 인스턴스를 static import와 함께 사용
package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;
import study.querydsl.entity.Team;
import static org.assertj.core.api.Assertions.assertThat;
import static study.querydsl.entity.QMember.*; // 추가!
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@Test
public void startQuerydsl(){
// QMember m = new QMember("m"); // 별칭 직접 지정
// QMember qMember = QMember.member; //기본 인스턴스 사용
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
✅ use_sql_comments
yml 파일에 다음 설정을 추가하면 실행되는 JPQL을 볼 수 있다.
콘솔에 표시되는 쿼리문 위에 어떤 실행을 하려는지를 주석으로 알려준다.
## application.yml
spring.jpa.properties.hibernate.use_sql_comments : true
org.hibernate.SQL :
/* insert for
study.querydsl.entity.Member */insert
into
member (age, team_id, username, member_id)
values
(?, ?, ?, ?)
org.hibernate.SQL :
/* select
member1
from
Member member1
where
member1.username = ?1 */ select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
where
m1_0.username=?
HINT(주석)를 보면 실제 어떤 객체를 이용하여 INSERT/SELECT하는지에 대해 나옵니다.
728x90
반응형
'QueryDSL' 카테고리의 다른 글
[JPA 활용] JPQL vs Querydsl - assertThat() 사용법 (2) | 2024.11.17 |
---|---|
[JPA 활용] QueryDSL 환경설정 - java: Attempt to recreate a file for type 오류, 에러 해결 (2) | 2024.11.16 |
[JPA 활용] QueryDSL (4) | 2024.11.14 |