μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

쿼리DSL μ‚¬μš©λ²• - μž‘μ„± 쀑 -

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2024. 3. 27. 15:49

ν™˜κ²½ μ„€μ •

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