Querydsl 기본 문법 - 1

Hyeon·2023년 7월 25일
0

Querydsl

목록 보기
4/7

데이터베이스 테이블은 아래와 같이 세팅해주었다.

JPQL vs Querydsl

  1. JPQL 코드
String qlString =
        "select m from Member m" +
                " where m.username = :username";
Member findMember = em.createQuery(qlString, Member.class)
        .setParameter("username", "member1")
        .getSingleResult();
  1. Querydsl 코드
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m");

Member findMember = queryFactory
        .select(m)
        .from(m)
        .where(m.username.eq("member1"))
        .fetchOne();

Q-Type 사용법

QMember qMember = new QMember("m"); //별칭 직접 지정 
QMember qMember = QMember.member; //기본 인스턴스 사용

기본 인스턴스를 static import 해서 사용하는 방법을 권장한다!
같은 테이블을 조인해야 하는 경우가 아니라면 기본 인스턴스를 사용하자.

Member findMember = queryFactory
          .select(member)
          .from(member)
          .where(member.username.eq("member1"))
          .fetchOne();

아래 설정을 추가하면 실행되는 JPQL 을 확인할 수 있다.

spring.jpa.properties.hibernate.use_sql_comments: true

검색 조건 쿼리

JPQL이 제공하는 모든 검색 조건을 제공한다.

Member findMember = queryFactory
        .selectFrom(member)
        .where(member.username.eq("member1")
                .and(member.age.eq(10)))
        .fetchOne();

조건이 and 로 연결될 경우, 아래 코드와 같이 and 대신에 , 를 사용해도 된다. 이 방법의 경우, null 이 들어갔을 때 null 은 무시하기 때문에 동적 쿼리를 짤 때 유용하다.

Member findMember = queryFactory
        .selectFrom(member)
        .where(member.username.eq("member1"),
                member.age.eq(10))
        .fetchOne();

결과 조회

  • fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환
  • fetchOne() : 단 건 조회
    결과가 없으면 : null
    결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException
  • fetchFirst() : limit(1).fetchOne()
  • fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행
  • fetchCount(): count 쿼리로 변경해서 count 수 조회

정렬

List<Member> result = queryFactory
        .selectFrom(member)
        .where(member.age.eq(100))
        .orderBy(member.age.desc(), member.username.asc().nullsLast())
        .fetch();

페이징

List<Member> result = queryFactory
        .selectFrom(member)
        .orderBy(member.username.desc())
        .offset(1)
        .limit(2)
        .fetch();

출처

  • 인프런 김영한님의 실전! Querydsl 강의를 수강하며 정리한 내용입니다.
profile
컴공학부생입니다.

0개의 댓글