Skip to content

Commit 6174174

Browse files
committed
fix:search book method fixed
1 parent b5fb654 commit 6174174

File tree

3 files changed

+77
-32
lines changed

3 files changed

+77
-32
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.poolc.api.book.domain;
2+
3+
import org.springframework.data.jpa.domain.Specification;
4+
5+
import javax.persistence.criteria.Predicate;
6+
7+
public class BookSpecification {
8+
public static Specification<Book> findByTitleAndSortOption(String keyword, String sortOption) {
9+
return (root, query, criteriaBuilder) -> {
10+
// 1. WHERE 조건 처리 (keyword 필터링)
11+
Predicate predicate = criteriaBuilder.like(root.get("title"), "%" + keyword + "%");
12+
13+
// 2. ORDER BY 처리
14+
if ("TITLE".equals(sortOption)) {
15+
query.orderBy(criteriaBuilder.asc(root.get("title")));
16+
} else if ("CREATED_AT".equals(sortOption)) {
17+
query.orderBy(criteriaBuilder.desc(root.get("createdAt")));
18+
} else if ("RENT_TIME".equals(sortOption)) {
19+
query.orderBy(criteriaBuilder.desc(root.get("rentDate")));
20+
}else{
21+
query.orderBy(criteriaBuilder.asc(root.get("title")));
22+
}
23+
24+
return predicate;
25+
};
26+
}
27+
28+
public static Specification<Book> findByAuthorAndSortOption(String keyword, String sortOption) {
29+
return (root, query, criteriaBuilder) -> {
30+
// 1. WHERE 조건 처리 (keyword 필터링)
31+
Predicate predicate = criteriaBuilder.like(root.get("author"), "%" + keyword + "%");
32+
33+
// 2. ORDER BY 처리
34+
if ("TITLE".equals(sortOption)) {
35+
query.orderBy(criteriaBuilder.asc(root.get("title")));
36+
} else if ("CREATED_AT".equals(sortOption)) {
37+
query.orderBy(criteriaBuilder.desc(root.get("createdAt")));
38+
} else if ("RENT_TIME".equals(sortOption)) {
39+
query.orderBy(criteriaBuilder.desc(root.get("rentDate")));
40+
}else{
41+
query.orderBy(criteriaBuilder.asc(root.get("title")));
42+
}
43+
44+
return predicate;
45+
};
46+
}
47+
48+
// Tag를 기준으로 검색하는 쿼리도 추가
49+
public static Specification<Book> findByTagsContainingAndSortOption(String keyword, String sortOption) {
50+
return (root, query, criteriaBuilder) -> {
51+
// 1. WHERE 조건 처리 (tags 필터링)
52+
Predicate predicate = criteriaBuilder.isMember(keyword, root.get("tags"));
53+
54+
// 2. ORDER BY 처리
55+
if ("TITLE".equals(sortOption)) {
56+
query.orderBy(criteriaBuilder.asc(root.get("title")));
57+
} else if ("CREATED_AT".equals(sortOption)) {
58+
query.orderBy(criteriaBuilder.desc(root.get("createdAt")));
59+
} else if ("RENT_TIME".equals(sortOption)) {
60+
query.orderBy(criteriaBuilder.desc(root.get("rentDate")));
61+
}
62+
63+
return predicate;
64+
};
65+
}
66+
}

src/main/java/org/poolc/api/book/repository/BookRepository.java

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,23 @@
44
import org.poolc.api.book.domain.BookSortOption;
55
import org.springframework.data.domain.Page;
66
import org.springframework.data.domain.Pageable;
7+
import org.springframework.data.jpa.domain.Specification;
78
import org.springframework.data.jpa.repository.JpaRepository;
89

910
import java.util.Optional;
11+
12+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
1013
import org.springframework.data.jpa.repository.Query;
14+
import org.springframework.data.repository.query.Param;
1115

12-
public interface BookRepository extends JpaRepository<Book, Long> {
16+
public interface BookRepository extends JpaRepository<Book, Long>, JpaSpecificationExecutor<Book> {
1317
boolean existsByTitleAndAuthor(String title, String author);
1418

1519
Optional<Book> findBookById(Long id);
1620
Page<Book> findAllByOrderByCreatedAtDesc(Pageable pageable);
1721
Page<Book> findAllByOrderByTitleAsc(Pageable pageable);
1822

19-
@Query("SELECT b FROM Book b WHERE b.title LIKE '%:keyword%' " +
20-
"ORDER BY " +
21-
"CASE WHEN :sortOption = 'TITLE' THEN b.title END ASC, " +
22-
"CASE WHEN :sortOption = 'CREATED_AT' THEN b.createdAt END DESC, " +
23-
"CASE WHEN :sortOption = 'RENT_TIME' THEN b.rentDate END DESC, " +
24-
"CASE WHEN :sortOption = 'RENT_TIME' THEN b.title END ASC")
25-
Page<Book> findAllByTitleContaining(String keyword,String sortOption, Pageable pageable);
26-
27-
@Query("SELECT b FROM Book b WHERE b.author LIKE '%:keyword%' " +
28-
"ORDER BY " +
29-
"CASE WHEN :sortOption = 'TITLE' THEN b.title END ASC, " +
30-
"CASE WHEN :sortOption = 'CREATED_AT' THEN b.createdAt END DESC, " +
31-
"CASE WHEN :sortOption = 'RENT_TIME' THEN b.rentDate END DESC, " +
32-
"CASE WHEN :sortOption = 'RENT_TIME' THEN b.title END ASC")
33-
Page<Book> findAllByAuthorContaining(String keyword, String sortOption, Pageable pageable);
34-
35-
@Query("SELECT b FROM Book b WHERE :keyword MEMBER OF b.tags " +
36-
"ORDER BY " +
37-
"CASE WHEN :sortOption = 'TITLE' THEN b.title END ASC, " +
38-
"CASE WHEN :sortOption = 'CREATED_AT' THEN b.createdAt END DESC, " +
39-
"CASE WHEN :sortOption = 'RENT_TIME' THEN b.rentDate END DESC, " +
40-
"CASE WHEN :sortOption = 'RENT_TIME' THEN b.title END ASC")
41-
Page<Book> findAllByTagsContaining(String keyword,String sortOption, Pageable pageable);
23+
Page<Book> findAll(Specification<Book> spec, Pageable pageable);
4224

4325
@Query("SELECT b FROM Book b " +
4426
"ORDER BY CASE WHEN b.rentDate IS NULL THEN 0 ELSE 1 END, " +

src/main/java/org/poolc/api/book/service/BookServiceImpl.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package org.poolc.api.book.service;
22

33
import lombok.RequiredArgsConstructor;
4-
import org.poolc.api.book.domain.Book;
5-
import org.poolc.api.book.domain.BookSearchOption;
6-
import org.poolc.api.book.domain.BookSortOption;
7-
import org.poolc.api.book.domain.BookStatus;
4+
import org.poolc.api.book.domain.*;
85
import org.poolc.api.book.dto.request.CreateBookRequest;
96
import org.poolc.api.book.dto.request.UpdateBookRequest;
107
import org.poolc.api.book.dto.response.BookResponse;
@@ -49,11 +46,11 @@ public Page<BookResponse> searchBooks(int page, BookSearchOption option, String
4946
sortOption = BookSortOption.TITLE;
5047
}
5148
if (option == BookSearchOption.TITLE) {
52-
books = bookRepository.findAllByTitleContaining(keyword,sortOption.name(), PageRequest.of(page, PAGE_SIZE));
53-
} else if (option == BookSearchOption.AUTHOR) {
54-
books = bookRepository.findAllByAuthorContaining(keyword,sortOption.name(), PageRequest.of(page, PAGE_SIZE));
49+
books = bookRepository.findAll(BookSpecification.findByTitleAndSortOption(keyword, sortOption.name()), PageRequest.of(page, PAGE_SIZE));
50+
}else if (option == BookSearchOption.AUTHOR) {
51+
books = bookRepository.findAll(BookSpecification.findByAuthorAndSortOption(keyword, sortOption.name()), PageRequest.of(page, PAGE_SIZE));
5552
} else if (option == BookSearchOption.TAG) {
56-
books = bookRepository.findAllByTagsContaining(keyword,sortOption.name(), PageRequest.of(page, PAGE_SIZE));
53+
books = bookRepository.findAll(BookSpecification.findByTagsContainingAndSortOption(keyword, sortOption.name()), PageRequest.of(page, PAGE_SIZE));
5754
} else {
5855
throw new IllegalArgumentException("잘못된 검색 옵션입니다.");
5956
}

0 commit comments

Comments
 (0)