μΉ΄ν
κ³ λ¦¬ μμ
쿼리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