본문 바로가기

Tips

QueryDsl 메서드 모음

1. from() : SQL의 FROM 구문과 동일한 기능. 특정 테이블이나 엔티티를 지정할 수 있다.

List<String> bookTitles = queryFactory
      .select(book.title)
      .from(book)
      .fetch();

2. select() : SQL의 select 구문과 동일한 기능. 특정 엔티티 또는 필드를 조회할 수 있다.

List<String> bookTitles = queryFactory
      .select(book.title)
      .from(book)
      .fetch();

3.selectFrom() : select() + from() 결합 메서드. 즉, 조회할 엔티티를 바로 선택하면서 쿼리를 시작.

List<Book> books = queryFactory
                .selectFrom(book)
                .fetch();

 

4. where() : 검색 조건을 설정, 여러 조건을 동시에 설정할 수 있음.

List<Book> books = queryFactory
                .selectFrom(book)
                .where(book.price.goe(20.0),
                       book.title.like("%Hobbit%"))
                .fetch();

5. leftJoin(좌측 엔티티or테이블, 우측테이블) : SQL의 LEFT JOIN 구문과 동일한 기능을 수행.
이 메서드를 사용하여 주어진 엔티티나 테이블에 대해 LEFT JOIN을 수행할 수 있다.

List<Tuple> result = queryFactory
      .select(book, author)
      .from(book)
      .leftJoin(book.author, author)
      .fetch();

 

주로 두 테이블에서 관련된 데이터를 모두 선택할 때 사용한다.
"왼쪽 테이블"의 모든 레코드(가로, 행)를 반환하고, "오른쪽 테이블"의 일치하는 레코드를 반환.
만약 일치하는 레코드가 없다면, "왼쪽 테이블"의 모든 레코드와 함께 null을 반환.

Ex. 'Book' 테이블, 'Author' 테이블. 각각의 책에 대한 작가의 정보를 조회하려는 상황.

<Library 테이블>
libraryName, List<libraryBook> libraryBooks

<LibraryBook 테이블>
Book.BookStatus, library, book

이 두 테이블을 LEFT JOIN 하면, "왼쪽" Library 테이블의 모든 데이터
이와 일치하는 "오른쪽" LibraryBook 테이블의 데이터를 함께 조회할 수 있다.
만약 Library에 해당하는 LibraryBook이 LibraryBook 테이블에 없다면, 해당 책은 NULL 이 반환.

List<Library> libraries = queryFactory
    .selectFrom(library)
    .leftJoin(library.libraryBooks, libraryBook)
    .fetch();

Library 테이블의 libraryBooks 필드와 LibraryBook 테이블을 LEFT JOIN하여,
각 도서관에 대응되는 도서관에 보관중인 책(libraryBook)을 가져온다.

만약 도서관에 보관중인 책 중, AVAILABLE 상태만 가져오려면

List<Library> libraries = queryFactory
    .selectFrom(library)
    .leftJoin(library.libraryBooks, libraryBook)
    .on(libraryBook.bookStatus.eq(Book.BookStatus.AVAILABLE))
    .fetch();



 

6. on() : 이 메서드는 JOIN시 조인 조건을 지정하는데 사용.

List<Tuple> result = queryFactory
      .select(book, author)
      .from(book)
      .leftJoin(author).on(book.authorId.eq(author.id))
      .fetch();

 

7. orderBy() : SQL의 ORDER BY 구문과 동일한 기능. 결과를 특정 필드를 기준으로 정렬.

List<Book> books = queryFactory
      .selectFrom(book)
      .orderBy(book.price.desc())
      .fetch();

8. offset() : 결과 집합의 시작 위치를 지정. 페이징 처리를 위해 주로 사용되며 SQL의 OFFSET과 동일

List<Book> books = queryFactory
      .selectFrom(book)
      .offset(10) // skip the first 10
      .fetch();

9. limit() : 결과 집합에서 가져올 행의 수를 제한. SQL의 LIMIT 구문과 동일한 기능

List<Book> books = queryFactory
      .selectFrom(book)
      .limit(5) // only fetch top 5
      .fetch();

10. and() : 여러 조건을 모두 만족해야 하는 조건을 설정.

List<Book> books = queryFactory
                .selectFrom(book)
                .where(book.price.goe(20.0)
                       .and(book.title.like("%Hobbit%")))
                .fetch();

<where()의 , 조건추가 VS .and() 차이 >
where()에서 , 로 여러 조건을 넣는 경우는 여러 조건을 동시에 받아 각 조건이 모두 충족되는 경우에 해당.
and()에서는 첫번째 조건에 이어 추가 조건을 명시
즉, 기본적으로 where()에서 , 로 조건을 걸든, .and()를 사용해서 추가 조건 생성하든 동일한 결과를 제공.

11. or() : 여러 조건 중 하나라도 만족하면 되는 조건을 설정

List<Book> books = queryFactory
                .selectFrom(book)
                .where(book.price.goe(20.0)
                       .or(book.title.like("%Hobbit%")))
                .fetch();

12. eq() : 필드의 값이 특정 값과 같은지 검사

book.title.eq("The Hobbit")

13. ne() : 필드의 값이 특정 값과 다른지 검사

book.title.ne("The Hobbit")

14. goe() >= 이상, gte() > 초과 : 필드의 값이 특정 값보다 크거나 같은지 검사

book.price.goe(20.0)
book.price.gte(20.0)

15. loe() <= 이하, lte() < 미만 : 필드의 값이 특정 값보다 작거나 같은지 검사

book.price.loe(20.0)
book.price.lte(20.0)

16. between() : 필드의 값이 두 값 사이에 있는지 검사.

book.price.between(10.0, 20.0)

17. isNull(), isNotNull() : 필드의 값이 null 인지, null이 아닌지 검사.

book.publisher.isNull()
book.publisher.isNotNull()

18. like() : 필드의 값이 특정 패턴과 일치하는지 검사 (제목에 Hobbit이 포함된 책)

book.title.like("%Hobbit%")

19. in() : 필드의 값이 특정 리스트에 포함되는지 검사 (필드의 장르가 리스트의 내용에 들어가는지)

book.genre.in(Arrays.asList("Fantasy", "Adventure"))

 

'Tips' 카테고리의 다른 글

JMeter 설치 & 사용 법  (0) 2023.05.25
JUnit Test 코드 TIP  (0) 2023.05.16
Spring Data JPA VS JPQL and QueryDsl  (0) 2023.05.15
Mapstruct @Mapping(target = , source = )  (0) 2023.05.13
Spring Data JPA - 자동 완성 메서드 규칙  (0) 2023.05.12