JPQL과 QueryDSL 문법 비교
기본 JPQL
// member1 찾기
String qlString = "select m from Member m where m.username = :username";
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
QueryDSL
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
static import, selectFrom()
이를 static import해서 사용할 수도 있다.
QueryDSL은 QType 클래스(여기서 QType 클래스는 Member가 있다면 QMember를 뜻함) 앨리어스의 기본 값을 갖는 클래스를 제공하기 떄문이다.
또한 select와 from의 대상이 같을 때 사용할 수 있게 QueryDSL은 .selectFrom() 메서드를 제공한다.
위 2가지를 조합하면 아래와 같다.
import static querydsl.querydsl.domain.QMember.member;
Member findMember = queryFactory
.selectFrom(QMember.member)
.where(QMember.member.username.eq("member1")
.and(QMember.member.age.eq(10)))
.fetchOne();
static import된 것이 중요하다.
나머지 QueryDSL의 문법들은 우리가 상식선에서 생각할 수 있는 메서드들을 왠만하면 다 제공한다.
between 메서드
Member findMember = queryFactory
.selectFrom(QMember.member)
.where(QMember.member.username.eq("member1")
.and(QMember.member.age.between(10, 30)))
.fetchOne();
and와 ','
QueryDSL에서 and 메서드와 ','는 같은 의미이다.
selectFrom(QMember.member)
.where(
// and와 ','는 같은 것이다.
// QMember.member.username.eq("member1").and(QMember.member.age.between(10, 30)))
QMember.member.username.eq("member1"), (QMember.member.age.between(10, 30)))
.fetchOne();
QueryDSL 결과 조회
fetchOne()과 fetchFirst()
List<Member> fetch = queryFactory
.selectFrom(member)
.fetch();
Member fetchOne = queryFactory
.selectFrom(member)
.fetchOne();
/**
* fetchFirst == limit(1).fetchOne
*/
Member fetchFirst = queryFactory
.selectFrom(member)
.fetchFirst();
/**
* 강의에서 나오는 fetchResult는 실제로 사용하지 않음
* 아래와 같이 count query를 별도로 작성해야한다.
* 기존의 fetchCount 또한 아래로 대체
*/
Long total = queryFactory
.select(member.count())
.from(member)
.fetchOne();
'JPA > QueryDSL' 카테고리의 다른 글
[QueryDSL] 6. 동적 쿼리(중요⭐️) - BooleanBuilder, Where 다중 파라미터 사용 (0) | 2023.12.06 |
---|---|
[QueryDSL] 5. QueryDSL의 프로젝션과 결과 반환, @QueryProjection (0) | 2023.12.06 |
[QueryDSL] 4. QueryDSL의 Join과 FetchJoin (0) | 2023.12.06 |
[QueryDSL] 3. 정렬과 페이징, SubQuery (0) | 2023.12.04 |
[QueryDSL] 1. QueryDSL 의존성과 기본 사용법 (0) | 2023.12.01 |