DOing
[Querydsl] 정렬, 페이징, 집계 함수, 그룹 함수 본문
🌱 정렬
: orderBy이용
@Test
public void sort() {
em.persist(new Member(null, 100));
em.persist(new Member("member5", 100));
em.persist(new Member("member6", 100));
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
.fetch();
Member member5 = result.get(0);
Member member6 = result.get(1);
Member memberNull = result.get(2);
}
🌱 페이징
: offset() -> 페이징의 시작점 지정
: limit() -> 페이징 크기
@Test
public void paging1() {
em.persist(new Member(null, 100));
em.persist(new Member("member5", 100));
em.persist(new Member("member6", 100));
List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1) //0부터 시작(zero index)
.limit(5) //최대 5건 조회
.fetch();
assertThat(result.size()).isEqualTo(5);
}
@Test
public void paging2() {
em.persist(new Member(null, 100));
em.persist(new Member("member2", 100));
em.persist(new Member("member3", 100));
em.persist(new Member("member4", 100));
QueryResults<Member> queryResults = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetchResults();
assertThat(queryResults.getTotal()).isEqualTo(4);
assertThat(queryResults.getLimit()).isEqualTo(2);
assertThat(queryResults.getOffset()).isEqualTo(1);
assertThat(queryResults.getResults().size()).isEqualTo(2);
}
🌱 집계함수
: 결과 레코드들에 대한 산술적인 연산을 한 결과(스칼라)값을 출력합니다.
여러가지가 있지만 그 중 count, sum, max, min, avg가 많이 사용됩니다.
주의 할 점은 집계합수는 집합 안에 NULL 값이 있을 경우 이를 제외하고 처리한다는 것 입니다.
@Test
public void aggregation() throws Exception {
em.persist(new Member(null, 100));
em.persist(new Member("member2", 100));
em.persist(new Member("member3", 110));
em.persist(new Member("member4", 90));
// Querydsl 이 제공하는 Tuple
// member 단일 타입을 조회하는 것이 아닌 데이터 타입이 여러개일때는 튜플을 사용한다
// 실무에서는 튜플을 사용하지않고 DTO를 주로 쓴다.
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(400);
assertThat(tuple.get(member.age.avg())).isEqualTo(100);
assertThat(tuple.get(member.age.max())).isEqualTo(110);
assertThat(tuple.get(member.age.min())).isEqualTo(90);
}
🌱 그룹화
: GROUP BY 명령어를 통해 특정 컬럼을 기준으로 그룹화 할 수 있습니다.
: GROUP BY 절에서 조건을 주려면 WHERE가 아닌, HAVING 절을 사용해야 합니다.
@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)
.having() // groupBy의 조건
.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);
}
'JPA' 카테고리의 다른 글
[Querydsl] 서브쿼리 (0) | 2021.08.04 |
---|---|
[Querydsl] Join (0) | 2021.08.04 |
[Querydsl] where 조건과 결과 조회 (0) | 2021.08.04 |
Querydsl이란? (0) | 2021.08.04 |
[JPA] 연속성 전이(CASCADE) (0) | 2021.07.15 |