desc()
, asc()
: 내림차순, 오름차순 일반 정렬nullsLast()
, nullsFirst()
: null 데이터 순서 부여 @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 전용 쿼리를 별도로 작성해야 한다.
Tuple
: 여러개의 타입이 있을 때 막 꺼내올 수 있음 (실무에서는 tuple은 잘 쓰지않고 dto를 많이 사용)그룹화된 결과를 제한하려면 having
예시 )
...
.groupBy(item.price)
.having(item.price.gt(1000))
...
조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번쨰 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정하면 된다.
➡️ join(조인대상, 별칭으로 사용할 Q타입)
join()
, innerJoin()
: 내부 조인(inner join)leftJoin()
: left 외부 조인(left outer join)rightJoin()
: right 외부 조인(right outer join)on
과 성능 최적화를 위한 fetch
조인 제공 (→ 다음 on절에서 설명): 연관관계가 없는 필드로 조인