성장/jpa Querydsl 정리
JPQL과 Querydsl 비교
nix-be
2024. 7. 18. 10:51
728x90
JPQL과 Querydsl 비교
JPQL (Java Persistence Query Language)
- 문자 기반 쿼리: JPQL은 문자열을 기반으로 쿼리를 작성하므로, 쿼리 문법 오류는 실행 시점에 발견됩니다.
- 직접 파라미터 바인딩: 파라미터를 직접 바인딩해야 합니다.
- 예제:
@Test
public void startJPQL() {
String qlString = "select m from Member m where username =:username";
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
Querydsl
- 코드 기반 쿼리: Querydsl은 코드를 기반으로 쿼리를 작성하므로, 문법 오류는 컴파일 시점에 발견됩니다.
- 자동 파라미터 바인딩: 파라미터 바인딩이 자동으로 처리됩니다.
- 동시성 문제 해결: JPAQueryFactory를 생성할 때 제공하는 EntityManager에 따라 동시성 문제가 해결됩니다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션마다 별도의 영속성 컨텍스트를 제공하기 때문에 동시성 문제는 걱정하지 않아도 됩니다.
- 예제:
@Test
public void startQuerydsl() {
queryFactory = new JPAQueryFactory(em);
QMember m = QMember.member;
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
Q클래스 인스턴스를 사용하는 두 가지 방법
- 별칭 직접 지정:
- QMember qMember = new QMember("m");
- 기본 인스턴스 사용:
- QMember qMember = QMember.member;
기본 인스턴스를 static import와 함께 사용
- 예제:
import static study.querydsl.entity.QMember.*;
@Test
public void startQuerydsl3() {
// member1을 찾아라.
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
Querydsl을 JPQL로 볼 수 있는 방법
- 설정:
- spring.jpa.properties.hibernate.use_sql_comments: true
728x90