[Spring-boot] Querydsl 기본문법(1)

전수·2023년 10월 31일
0

Spring

목록 보기
12/13

Querydsl

➡️JAVA로 쿼리를 작성하여 컴파일 시점에 문법 오류를 잡을 수 있고 파라미터 바인딩이 자동으로 된다는 장점과 복잡한 쿼리 작성 및 동적 쿼리를 해결할 수 있다.

결과 조회

  • fetch() : 1건 이상 조회(List 조회)하며 데이터가 없으면 빈 리스트를 반환

  • fetchOne() : 단 건 조회를 하며 결과가 없으면 null을 둘 이상이면 NonUniqueResultException 발생

  • fetchFirst() : limit(1).fetchOne()과 동일 값 반환

  • fetchResults() : 페이징 정보를 포함하며 total count 쿼리 추가 실행

  • fetchCount() : count 쿼리로 변경하여 count 수 조회

검색 조건

📌AND 연산

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

AND 연산은 ,로 대체 가능하다.

📌동등 조건

// username = 'member1'
member.username.eq("member1") 
//username != 'member1'
member.username.ne("member1") 
// username != 'member1
member.username.eq("member1").not()

📌NOT NULL

// username != NULL
member.username.isNotNull()

📌IN, BETWEEN

// age in (10,20)
member.age.in(10, 20) 
// age not in (10, 20)
member.age.notIn(10, 20) 
//between (10, 30)
member.age.between(10,30)

📌부등호 연산

// age >= 30
member.age.goe(30)
// age > 30
member.age.gt(30) 
// age <= 30
member.age.loe(30)
// age < 30
member.age.lt(30) 

📌LIKE

//like 검색
member.username.like("member%")
// like ‘%member%’ 검색
member.username.contains("member") 
//like ‘member%’ 검색
member.username.startsWith("member") 

기본적인 연산은 SQL 쿼리 작성과 동일하게 사용되기 때문에 쉽게 이해할 수 있다.

정렬

  • 일반 정렬 : 오름차순(asc()), 내림차순(desc())
  • null 정렬 : nullLast(), nullFirst()
/* 회원 나이 내림차순, 회원 이름 올림차순 정렬 + 회원 이름이 null이면 마지막 출력*/

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

페이징

List<Member> result = queryFactory
 .selectFrom(member)
 .orderBy(member.username.desc())
 .offset(1) 
 .limit(2) 
 .fetch();

offset은 시작지점을 나타내며 0부터 시작한다.
limit는 page size를 나타낸다.

QueryResults<Member> queryResults = queryFactory
 .selectFrom(member)
 .orderBy(member.username.desc())
 .offset(1)
 .limit(2)
 .fetchResults();

위의 쿼리와 다른 점은 fetchResults()를 사용했다는 점으로 count를 계산하는 쿼리가 추가로 실행되기 때문에 총 2번의 쿼리가 실행된다.

따라서 QueryResults를 통해 결과 값을 받으며 getTotal()로 count 값을 얻고, getResults()로 결과 값을 얻을 수 있다.

집합

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

SQL문법과 동일하게 합계, 평균, 최대, 최소 함수를 이용할 수 있으며 받은 인자의 타입이 모두 다르기 때문에 Querydsl에서 제공하는 Tuple을 통해 값을 받는다.

GroupBy

/*팀의 이름과 각 팀의 평균 연령*/
List<Tuple> result = queryFactory
 .select(team.name, member.age.avg())
 .from(member)
 .join(member.team, team)
 .groupBy(team.name)
 .fetch();

Querydsl의 기본 문법은 SQL 문법과 동일하게 작성할 수 있기 때문에 금방 배울 수 있다.
여기에 JOIN문법을 추가로 학습해야 하는데 JOIN 또한 SQL 문법과 동일하지만 조금 더 차근히 학습해보고자 따로 포스팅할 예정이다.

학습 강의 : 실전! Querydsl

0개의 댓글

관련 채용 정보