Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Querydsl] 정렬, 페이징, 집계 함수, 그룹 함수 본문

JPA

[Querydsl] 정렬, 페이징, 집계 함수, 그룹 함수

mangdo 2021. 8. 4. 21:49

 

🌱 정렬

: 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