Backend/Spring

QueryDSL(1)

brian110326 2024. 4. 12. 21:31

QueryDSL : JPQL 을 편하게 작성하도록 도와주는 빌더 클래스 모음(비표준 오픈소스 프레임워크)

앞에서 2개의 쿼리 작성법에 대해 포스팅했다. QueryDSL은 3번째 방법이며 2가지로 나뉜다. 첫번째는 QuerydslPredicateExecutor를 사용하는 것이고 두번째는 사용자 정의 인터페이스 설계 후 QueryDslRepositorySupport 상속받는 것이다. 이 글에서는 QuerydslPredicateExecutor에 관한 내용이다.

 

특징 : 쿼리를 문자가 아닌 코드로 작성해도 쉽고, 간결하며 모양도 쿼리와 비슷하게 개발

        : 다양한 상황에 맞게 쿼리를 생성해야 하는 경우 사용 ⇨ 동적 쿼리

 

1. pom.xml에서 querydsl dependency 추가하기

 

2. target/generated-sources 파일에 QEntity파일명.java 생성 확인

3. Repository에서 QuerydslPredicateExecutor 상속받기

 

4-1. Test하기

@Test
    public void testQueryDsl() {

        // QProduct 가져오기
        QProduct product = QProduct.product;

        Iterable<Product> products = productRepository.findAll(product.name.eq("Product1"));

        // 제품명이 Product10이고 가격이 5000 초과인 제품 조회
        // gt : greater than
        products = productRepository.findAll(product.name.eq("Product10").and(product.price.gt(5000)));

        // 제품명이 Product10이고 가격이 5000 이상인 제품 조회
        BooleanBuilder builder = new BooleanBuilder();
        builder.and(product.name.eq("Product10"));
        builder.and(product.price.goe(5000));
        products = productRepository.findAll(builder);

        // 제품명에 Product 글자가 포함된 제품 조회
        products = productRepository.findAll(product.name.contains("Product"));

        // 제품명에 Product 글자로 시작하는 제품 조회
        products = productRepository.findAll(product.name.startsWith("Product"));

        // 제품명에 Product 글자로 끝나는 제품 조회
        products = productRepository.findAll(product.name.endsWith("Product"));

        for (Product pro : products) {
            System.out.println(pro);
        }

    }

 

4-2. Test하기

@Test
    public void testQueryDsl2() {

        QMember2 member2 = QMember2.member2;

        BooleanBuilder builder = new BooleanBuilder();
        builder.and(member2.userName.eq("User1"));

        Iterable<Member2> list = member2Repository.findAll(builder, Sort.by("id").descending());

        for (Member2 member : list) {
            System.out.println(member);
        }
    }

'Backend > Spring' 카테고리의 다른 글

Pageable 객체  (0) 2024.04.12
QueryDSL(2)  (0) 2024.04.12
Native Sql  (0) 2024.04.12
JPQL  (0) 2024.04.11
영속성 전이 : CASCADE  (0) 2024.04.08