정렬
인프런 강의에서 나온 예시는
- 회원 정렬 순서
- 1. 회원 나이 내림차순(desc)
- 2. 회원 이름 올림차순(asc)
- 단 2에서 회원 이름이 없으면 마지막에 출력(nulls last)
이 예시를 Querydsl로 짜 볼 것이다.
@Test
public void sort() throws Exception {
em.persist(new Member(null, 100));
em.persist(new Member("member5", 100));
em.persist(new Member("member6", 100));
// when
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
.fetch();
//then
Member member5 = result.get(0);
Member member6 = result.get(1);
Member memberNull = result.get(2);
assertThat(member5.getUsername()).isEqualTo("member5");
assertThat(member6.getUsername()).isEqualTo("member6");
assertThat(memberNull.getUsername()).isNull();
}
여기서 정렬은 orderBy로 했습니다. orderBy에 의해 자신이 원하는 필드값을 asc 또는 desc 할 수 있습니다.
또, nullLast()와 nullFirst()가 존재해 null 인 것을 마지막 또는 처음에 출력할 수 있습니다.
JPQL도 알맞게 잘 실행된 것을 확인할 수 있습니다.
페이징
페이징 처리는 프로젝트에서 제일 중요한 부분이었습니다. 프론트가 원하는 양만큼 데이터를 주기 위해서는 페이징은 무조건 필요한 기술입니다. Querydsl에서 페이징 처리를 공부해 보겠습니다.
@Test
public void paging1() throws Exception {
List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetch();
assertThat(result.size()).isEqualTo(2);
}
paging은 offset이 0부터 시작합니다. offset(1)은 0을 건너 띄고 1부터 시작하는 것입니다.
limit(2)는 최대 2건 조회하는 것입니다.
- 전체 조회 수가 필요하면 fetchResults()를 사용하면 됩니다. 하지만 현재 스프링부트 3.0은 이 메서드가 deprecated 되었기 때문에 다른 방법을 사용해야 합니다.
- count쿼리와 페이징 쿼리를 분리해 사용한다고 합니다.
이 부분은 앞으로 강의에서 나오기 때문에 좀 더 공부를 해보고 해결해 봐야 할 것 같습니다.
집합
@Test
public void aggregation() throws Exception {
List<Tuple> result = queryFactory
.select(member.count(),
member.age.sum(),
member.age.avg(),
member.age.max(),
member.age.min())
.from(member)
.fetch();
Tuple tuple = result.get(0);
assertThat(tuple.get(member.count())).isEqualTo(4);
assertThat(tuple.get(member.age.sum())).isEqualTo(100);
assertThat(tuple.get(member.age.avg())).isEqualTo(25);
assertThat(tuple.get(member.age.max())).isEqualTo(40);
assertThat(tuple.get(member.age.min())).isEqualTo(10);
}
JPQL에서 제공하는 모든 집합 함수를 제공합니다. 이 test를 실행하면
이렇게 JPQL이 출력되는 것을 확인할 수 있습니다.
신기한 점은 여기서 Tuple로 반환했습니다. Tuple은 Querydsl에 있는 것으로 여러 가지 내용을 반환할 때 사용합니다.
GroupBy 사용
mySql에서 자주 사용하는 GroupBy도 사용할 수 있습니다.
@Test
public void group() throws Exception {
List<Tuple> result = queryFactory
.select(team.name, member.age.avg())
.from(member)
.join(member.team, team)
.groupBy(team.name)
.fetch();
Tuple teamA = result.get(0);
Tuple teamB = result.get(1);
assertThat(teamA.get(team.name)).isEqualTo("teamA");
assertThat(teamA.get(member.age.avg())).isEqualTo(15);
assertThat(teamB.get(team.name)).isEqualTo("teamB");
assertThat(teamB.get(member.age.avg())).isEqualTo(35);
}
이렇게 하면 member.team과 team을 join한 뒤 team이름으로 gorup화 합니다. 이렇게 하면 결과가 2개가 나오는데 이렇기 때문에 Tuple을 사용합니다. 하지만 프로젝트할 때는 DTO를 더 많이 사용했습니다. 강사님도 DTO로 하는 법을 알려주신다고 합니다.
group by 바로 다음에 having도 사용할 수 있습니다!!
출처
https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84/dashboard
'Spring JPA 공부 > Querydsl' 카테고리의 다른 글
Querydsl 기본 문법 (검색, 결과) (0) | 2023.08.28 |
---|---|
JPQL과 Querydsl에 차이 (0) | 2023.08.28 |
Querydsl 세팅 (0) | 2023.08.27 |