쿼리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
개발하는지호