상세 컨텐츠

본문 제목

[SPRING] Querydsl | 기본 문법(1)

JAVA/기본 & 강의복습

by ranlan 2021. 4. 30. 02:49

본문

728x90

Qtype 이용

1) 직접 선언(서브쿼리나 같은 테이블 조인 등 별칭이 달라야할 경우 사용)

// 별칭 직접 지정
QMember qMember = new QMember("m");

// 기본 별칭 사용
QMember qMember = QMember.member;

2) 기본 인스턴스로 등록(기본 별칭 사용)

import static study.querydsl.entity.QMember.*;

public Member findMember1() {

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

 

검색 조건

.and() 나 .or() 로 연결 가능

queryFactory
    .select(member)
    .from(member)
    .where(member.username.eq("member1")
            .and(member.age.between(10, 30))
    .fetch();

, 으로 나열하면 .and()와 동일 (*null값은 무시)

queryFactory
    .select(member)
    .from(member)
    .where(member.username.eq("member1"),
           member.age.between(10, 30))
    .fetch();

select와 from을 합쳐 selectFrom으로 사용 가능

queryFactory
    .selectFrom(member)
    .where(member.username.eq("member1"))
    .fetch();

JPQL이 제공하는 모든 검색 조건 제공

member.username.eq("member1") // username = 'member1'
member.username.ne("member1") //username != 'member1'
member.username.eq("member1").not() // username != 'member1'

member.username.isNull() // is null
member.username.isNotNull() // is not null

member.age.in(10, 20) // in (10,20)
member.age.notIn(10, 20) // not in (10, 20)
member.age.between(10,30) // between 10, 30

member.age.goe(30) // age >= 30
member.age.gt(30) // age > 30
member.age.loe(30) // age <= 30
member.age.lt(30) // age < 30

member.username.like("member%") // like 'member%'
member.username.contains("member") // like ‘%member%’
member.username.startsWith("member") // like ‘member%

 

결과 조회

리스트 조회 결과 없으면 빈 리스트 반환

List<Member> result = queryFactory.selectFrom(member).fetch();

조회 결과가 1개일 때

Member member = queryFactory.selectFrom(member).fetchOne();

조회 결과가 없을 시 null 반환

조회 결과가 1개 이상일 때 NonUniqueResultException 발생

 

조회 결과 중 가장 처음 1개

Member member = queryFactory.selectFrom(member).fetchFirst();

페이징에서 사용

QueryResults<Member> results = queryFactory.selectFrom(member).fetchResults();

// total count
long total = results.getTotal();
// result
List<Member> members = results.getResults();

select절에 count만 존재

long count = queryFactory.selectFrom(member).fetchCount();

select절에 엔티티가 아닌 조회할 필드를 지정해준 경우 결과값은 Tuple 

 

정렬

.asc() // 오름차순
.desc() // 내림차순
.nullLast() // null데이터 마지막으로
.nullFirst() // null데이터 처음으로

 

페이징

queryFactory
    .selectFrom(member)
    .orderBy(member.username.desc())
    .offset(1) // 시작 위치
    .limit(2) // 결과 개수
    .fetch();

count가 필요할 때

QueryResults<Member> results = queryFactory
        .selectFrom(member)
        .orderBy(member.username.desc())
        .offset(1)
        .limit(2)
        .fetchResults();
    
int offset = results.getOffset();
int limit = results.getLimit();
long count = reuslts.getTotal().size();
List<Member> members = results.getResults();

*count 쿼리가 실행되니 성능상 주의

*여러 테이블을 조인하는 경우 성능을 위해 count 전용 쿼리를 별도로 작성해야 함

 

집합

JPQL이 제공하는 모든 집합 함수 제공

List<Tuple> tuples = queryFactory
        .select(member.count(),
                member.age.sum(),
                member.age.avg(),
                member.age.max(),
                member.age.min())
        .from(member)
        .fetch();

group By와 having

.groupBy(item.price)
.having(item.price.gt(1000))

 

728x90

관련글 더보기

댓글 영역