개발하는지호

쿼리DSL 사용법 - 작성 중 -

by 개발하는지호

환경 설정

plugins {
    id 'org.springframework.boot' version '2.4.1'
    id 'java'
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'com.querydsl:querydsl-jpa'
    implementation 'com.querydsl:querydsl-apt'
}

querydsl {
    jpa = true
    querydslSourcesDir = "src/main/generated"
}

 

 

 

폴더 구조(예시)

 

src/
└── main/
    ├── java/
    │   └── com/
    │       └── yourcompany/
    │           └── yourproject/
    │               ├── domain/
    │               │   ├── entity/
    │               │   │   ├── Author.java
    │               │   │   └── Book.java
    │               │   └── repository/
    │               │       ├── BookRepository.java
    │               │       ├── BookRepositoryCustom.java
    │               │       └── BookRepositoryCustomImpl.java
    │               ├── service/
    │               │   └── BookService.java
    │               └── controller/
    │                   └── BookController.java
    ├── resources/
    │   └── application.properties
    └── generated-sources/  // Querydsl Q-Types 위치
        └── java/

 

 

코드 예시

 

package com.yourcompany.yourproject.domain.entity;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author")
    private List<Book> books = new ArrayList<>();

    // Constructors, Getters and Setters
}

 

 

package com.yourcompany.yourproject.domain.entity;

import javax.persistence.*;

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "author_id")
    private Author author;

    // Constructors, Getters and Setters
}

 

 

package com.yourcompany.yourproject.domain.repository;

import com.yourcompany.yourproject.domain.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BookRepository extends JpaRepository<Book, Long>, BookRepositoryCustom {
    // 기본적인 CRUD 메소드는 JpaRepository로부터 상속받음
}

 

 

package com.yourcompany.yourproject.domain.repository;

import com.yourcompany.yourproject.domain.entity.Book;
import java.util.List;

public interface BookRepositoryCustom {
    List<Book> findBooksByAuthorName(String authorName);
}

 

 

package com.yourcompany.yourproject.domain.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import com.yourcompany.yourproject.domain.entity.Book;
import com.yourcompany.yourproject.domain.entity.QAuthor;
import com.yourcompany.yourproject.domain.entity.QBook;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

public class BookRepositoryCustomImpl implements BookRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Book> findBooksByAuthorName(String authorName) {
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QBook book = QBook.book;
        QAuthor author = QAuthor.author;

        return queryFactory.selectFrom(book)
            .join(book.author, author)
            .where(author.name.eq(authorName))
            .fetch();
    }
}

 

 

package com.yourcompany.yourproject.service;

import com.yourcompany.yourproject.domain.entity.Book;
import com.yourcompany.yourproject.domain.repository.BookRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookService {

    private final BookRepository bookRepository;

    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    public List<Book> findBooksByAuthorName(String authorName) {
        return bookRepository.findBooksByAuthorName(authorName);
    }
}

 

 

package com.yourcompany.y

블로그의 정보

DevSecOps

개발하는지호

활동하기