[QueryDSL] 기본 문법2

윤경·2021년 12월 5일
0

QueryDSL

목록 보기
4/11
post-thumbnail

[5] 정렬

  • desc(), asc(): 내림차순, 오름차순 일반 정렬
  • nullsLast(), nullsFirst(): null 데이터 순서 부여

[6] 페이징

    @Test
    public void paging1() { // offset, limit로 페이징을 지원
        List<Member> result = queryFactory
                .selectFrom(member)
                .orderBy(member.username.desc())
                .offset(1)  // 0부터 시작(zero index)
                .limit(2)   // 최대 2건 조회
                .fetch();

        assertThat(result.size()).isEqualTo(2);
    }

    @Test
    public void paging2() { // 전체 조회 수가 필요할 때
        QueryResults<Member> queryResults = queryFactory
                .selectFrom(member)
                .orderBy(member.username.desc())
                .offset(1)
                .limit(2)
                .fetchResults();    // 페이징 쿼리 정보 포함. total count 쿼리 추가 실행 

        assertThat(queryResults.getTotal()).isEqualTo(4);
        assertThat(queryResults.getLimit()).isEqualTo(2);
        assertThat(queryResults.getOffset()).isEqualTo(1);
        assertThat(queryResults.getResults().size()).isEqualTo(2);
    }

⚠️ count 쿼리가 실행되니 성능상 주의해야 한다.

실무에서 페이징 쿼리를 작성할 때, 데이터를 조회하는 쿼리는 여러 테이블을 조인해야 하지만, count 쿼리는 조인이 필요 없는 경우도 있다.

그런데 이렇게 자동화된 count 쿼리는 원본 쿼리와 같이 모두 조인을 해버리기 때문에 성능이 잘 안 나올 수도 있다. count 쿼리에 조인이 필요없는 성능 최적화가 필요하다면 count 전용 쿼리를 별도로 작성해야 한다.


[7] 집합

  • Tuple: 여러개의 타입이 있을 때 막 꺼내올 수 있음 (실무에서는 tuple은 잘 쓰지않고 dto를 많이 사용)

집합 함수는

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

groupBy

그룹화된 결과를 제한하려면 having

예시 )

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

[8] 조인 - 기본 조인

기본 조인

조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번쨰 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다.
➡️ join(조인대상, 별칭으로 사용할 Q타입)

  • join(), innerJoin(): 내부 조인(inner join)
  • leftJoin(): left 외부 조인(left outer join)
  • rightJoin(): right 외부 조인(right outer join)
  • JPQL의 on과 성능 최적화를 위한 fetch 조인 제공 (→ 다음 on절에서 설명)

세타 조인

: 연관관계가 없는 필드로 조인

  • from 절에 엔티티를 선택해 세타 조인(나열)
  • 외부 조인이 불가능함 (→ 다음에 설명할 조인 on을 사용하면 외부 조인도 가능)

profile
개발 바보 이사 중

0개의 댓글