๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] QueryDSL ๋ฌธ๋ฒ• ๋ณธ๋ฌธ

๊ฒ€์ƒ‰ ์กฐ๊ฑด

 

  • member.username.eq("member1") // username = 'member1'
  • member.username.ne("member1") //username != 'member1'
  • member.username.eq("member1").not() // username != 'member1'
  • member.username.isNotNull() //์ด๋ฆ„์ด is not null
  • member.age.in(10, 20) // age in (10,20)
  • member.age.notIn(10, 20) // age not in (10, 20)
  • member.age.between(10,30) //between 10, 30
  • member.age.goe(30) // age >= 30
  • member.age.gt(30) // age > 30
  • member.age.loe(30) // age <= 30
  • member.age.lt(30) // age < 30
  • member.username.like("member%") //like ๊ฒ€์ƒ‰
  • member.username.contains("member") // like ‘%member%’ ๊ฒ€์ƒ‰
  • member.username.startsWith("member") //like ‘member%’ ๊ฒ€์ƒ‰

 

where() ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฒ€์ƒ‰์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋ฉด AND ๋กœ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋ฉด๋œ๋‹ค.

and ๋Œ€์‹  , ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค.

@Test
public void startQuerydsl2() {
    //member1์„ ์ฐพ์•„๋ผ.
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    Member findMember = queryFactory
            .select(member)
            .from(member)
            .where(member.username.eq("member1").and(member.age.eq(10)))//ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ
            .fetchOne();
    // qtype์€ static import๋กœ ์“ฐ๋Š”๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค.
    assertThat(findMember.getUsername()).isEqualTo("member1");
}

@Test
public void startQuerydsl3() {
    //member1์„ ์ฐพ์•„๋ผ.
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    Member findMember = queryFactory
            .select(member)
            .from(member)
            .where(member.username.eq("member1"),
                    member.age.eq(10)) // and ๋Œ€์‹  ์ด๋ ‡๊ฒŒ ๋Š์–ด๊ฐ€๋„ ๋œ๋‹ค.
            .fetchOne();
    // qtype์€ static import๋กœ ์“ฐ๋Š”๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค.
    assertThat(findMember.getUsername()).isEqualTo("member1");
}

๋˜ํ•œ qtype์€ QMember m = QMember("member1")๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” static import๋กœ ์“ฐ๋Š”๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค.

 

 

๊ฒฐ๊ณผ ์กฐํšŒ

  • fetch() : ๋ฆฌ์ŠคํŠธ ์กฐํšŒ, ๋ฐ์ดํ„ฐ ์—†์œผ๋ฉด ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
  • fetchOne() : ๋‹จ ๊ฑด ์กฐํšŒ
  • ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด : null
  • ๊ฒฐ๊ณผ๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด : com.querydsl.core.NonUniqueResultException
  • fetchFirst() : limit(1).fetchOne()
  • fetchResults() : ํŽ˜์ด์ง• ์ •๋ณด ํฌํ•จ, total count ์ฟผ๋ฆฌ ์ถ”๊ฐ€ ์‹คํ–‰
  • fetchCount() : count ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ด์„œ count ์ˆ˜ ์กฐํšŒ
@Test
public void startQuerydsl4(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    //๋ฆฌ์ŠคํŠธ ์กฐํšŒ
    List<Member> fetch = queryFactory
            .selectFrom(member)
            .fetch();

    //๋‹จ๊ฑด ์กฐํšŒ
    Member fetchOne = queryFactory
            .selectFrom(member)
            .fetchOne();

    //์ฒ˜์Œ ํ•œ ๊ฑด ์กฐํšŒ
    Member findMember2 = queryFactory
            .selectFrom(member)
            .fetchFirst();

    //ํŽ˜์ด์ง•์—์„œ ์‚ฌ์šฉ
    QueryResults<Member> results = queryFactory
            .selectFrom(member)
            .fetchResults();
    results.getTotal();
    List<Member> content = results.getResults();
    
    //count ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝ
    long count = queryFactory
            .selectFrom(member)
            .fetchCount();

}

 

 

์ •๋ ฌ

/**
 * ํšŒ์› ์ •๋ ฌ ์ˆœ์„œ
 * 1. ํšŒ์› ๋‚˜์ด ๋‚ด๋ฆผ์ฐจ์ˆœ(desc)
 * 2. ํšŒ์› ์ด๋ฆ„ ์˜ฌ๋ฆผ์ฐจ์ˆœ(asc)
 * ๋‹จ 2์—์„œ ํšŒ์› ์ด๋ฆ„์ด ์—†์œผ๋ฉด ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅ(nulls last)
 */
@Test
public void sort() {
    
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    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);
    
    assertThat(member5.getUsername()).isEqualTo("member5");
    assertThat(member6.getUsername()).isEqualTo("member6");
    assertThat(memberNull.getUsername()).isNull();
}

 

ํŽ˜์ด์ง• ์กฐํšŒ ๊ฑด์ˆ˜ ์ œํ•œ

 

@Test
public void paging1(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    List<Member> result = queryFactory
            .selectFrom(member)
            .orderBy(member.username.desc())
            .offset(1) //๋ช‡๊ฐœ์”ฉ skipํ• ๊ฑด์ง€, 0๋ถ€ํ„ฐ ์‹œ์ž‘
            .limit(2) // ์ตœ๋Œ€ 2๊ฑด ์กฐํšŒ
            .fetch();

    assertThat(result.size()).isEqualTo(2);
}

 

ํŽ˜์ด์ง• ์ „์ฒด ์กฐํšŒ

@Test
public void paging2() {
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    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);
}

 

์ง‘ํ•ฉ

 

//์ง‘ํ•ฉ ํ•จ์ˆ˜
/**
 * JPQL
 * select
 * COUNT(m), //ํšŒ์›์ˆ˜
 * SUM(m.age), //๋‚˜์ด ํ•ฉ
 * AVG(m.age), //ํ‰๊ท  ๋‚˜์ด
 * MAX(m.age), //์ตœ๋Œ€ ๋‚˜์ด
 * MIN(m.age) //์ตœ์†Œ ๋‚˜์ด
 * from Member m
 */

@Test
public void aggregation(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    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)
}

@Test
public void aggregation2(){
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    List<Tuple> results = queryFactory
            .select(team.name, member.age.avg())
            .from(member)
            .join(member.team, team) // member.team๊ณผ team์„ join
            .groupBy(team.name) // team ์ด๋ฆ„์œผ๋กœ ๊ทธ๋ฃนํ•‘(๋ฌถ์Œ)
            .fetch();

    Tuple teamA = results.get(0);
    Tuple teamB = results.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);
}

 

groupBy , ๊ทธ๋ฃนํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด having

groupBy(), having() ์˜ˆ์‹œ

 

groupBy(item.price)

.having(item.price.gt(1000))