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);
        
   }