DevKim

[Querydsl] 기본 문법 - 검색 조건 쿼리, 정렬, 페이징, 집합 본문

JPA

[Querydsl] 기본 문법 - 검색 조건 쿼리, 정렬, 페이징, 집합

on_doing 2021. 7. 22. 14:16
728x90

[ 기본 검색 조건 ]

검색 조건은 .and() .or()를 매서드 체인으로 연결할 수 있다.

queryFactory
	.selectFrom(member)
	.where(member.username.eq("member1")
		.and(member.age.eq(10)))
	.fetchOne();

where문의 경우 ','로 연결해도 모두 and로 인식해주기 때문에 아래와 같이 사용해된다고한다.

queryFactory
        .selectFrom(member)
        .where(member.username.eq("member1"),
        member.age.eq(10))
        .fetchOne();

JPQL이 제공하는 모든 검색 조건 제공한다.

 

1. == & null 여부

.eq("member1")
.ne("member1") //== .eq("member1").not()

.isNotNull()

2. in절, between 절

.in(10,20)
.notIn(10,20)

.between(10,30)

3. 대소비교

age.goe(30) //age>=30
age.gt(30) //age>30

age.loe(30) //age<=30
agd.lt(30) //age<30

4. like 조건

.like("member%")
.contains("member") //%member%
.startWith("member") //member%

[ 결과 조회 ]

1. fetch( )

-리스트 조회

List<Member> fetch = queryFactory
		.selectFrom(member)
		.fetch();

2. fetchOne( )

- 단건 조회

Member fetchOne = queryFactory
		.selectFrom(member)
		.fetchOne();

 

3. fetchFirst( )

- 데이터 1개만 조회

(=limit(1).fetchone() 과 동일)

Member fetchFirst = queryFactory
		.selectFrom(QMember.member)
		.fetchFirst();

4. fetchResults( )

- 페이징 정보 포함

- total count 쿼리 추가 실행

QueryResults<Member> results = queryFactory
                .selectFrom(member)
                .fetchResults();

//total 제공
results.getTotal(); 

//getResults로 꺼내줘야 content가 나옴
List<Member> content = results.getResults();

5. fetchCount( )

- count 쿼리로 변경해서 count 수 조회

long count = queryFactory
	.selectFrom(member)
	.fetchCount();

[ 정렬 ]

List<Member> result = queryFactory
                .selectFrom(member)
                .where(member.age.eq(100))
                .orderBy(member.age.desc(), member.username.asc().nullsLast())
                .fetch();

* nullsLast( ) , nullsFirst( ) 

- null 데이터 순서 부여


[ 페이징 ]

//페이징 - 조회 건수 제한
    @Test
    public void paging1() { List<Member> result = queryFactory
            .selectFrom(member)
            .orderBy(member.username.desc())
            .offset(1) //0부터 시작(zero index)
            .limit(2) //최대 2건 조회
            .fetch();
        assertThat(result.size()).isEqualTo(2);
    }

    // 페이징 - 전체 조회수가 필요하다면?
    @Test
    public void paging2() {
        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이 제공하는 모든 집합함수 제공

- COUNT,SUM,AVG,MAX,MIN

List<Tuple> result = queryFactory
                .select(member.count(),
                        member.age.sum(),
                        member.age.avg(),
                        member.age.max(),
                        member.age.min())
                .from(member)
                .fetch();

[ groupBy ]

조건 : 팀의 이름과 각 팀의 팀원들의 평균 나이를 구하라

List<Tuple> result = queryFactory
                .select(team.name,member.age.avg())
                .from(member)
                .join(member.team,team)
                .groupBy(team.name)
                .fetch();

* groupBy 뒤에 having 절로 결과를 제한할 수 있다 *

.groupBy(item.price)
.having(item.price.gt(1000))
728x90
Comments