[UPDATE] SPEC 수정

main
bjkim 11 months ago
parent 220a0f4e89
commit 9157033ef1

@ -24,6 +24,8 @@ import java.util.Optional;
public class ProjectService { public class ProjectService {
private final ProjectRepository projectRepository; private final ProjectRepository projectRepository;
private final ProjectSpecification projectSpecification;
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
public List<ProjectEntity> findAll() { public List<ProjectEntity> findAll() {
@ -41,11 +43,10 @@ public class ProjectService {
Sort.by(Sort.Direction.fromString(request.getSortDirection()), request.getSortField()) Sort.by(Sort.Direction.fromString(request.getSortDirection()), request.getSortField())
); );
// String -> LocalDate 변환
LocalDate startDate = parseDate(request.getStartDate()); LocalDate startDate = parseDate(request.getStartDate());
LocalDate endDate = parseDate(request.getEndDate()); LocalDate endDate = parseDate(request.getEndDate());
Specification<ProjectEntity> spec = ProjectSpecification.searchByConditions( Specification<ProjectEntity> spec = projectSpecification.searchByConditions(
request.getSearchType(), request.getSearchType(),
request.getKeyword(), request.getKeyword(),
startDate, startDate,

@ -1,38 +1,68 @@
package kr.re.etri.security.jwt.specification; package kr.re.etri.security.jwt.specification;
import jakarta.persistence.criteria.Path; import jakarta.annotation.PostConstruct;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.EntityManager;
import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.EntityType;
import jakarta.persistence.metamodel.Metamodel;
import kr.re.etri.security.jwt.entity.ProjectEntity; import kr.re.etri.security.jwt.entity.ProjectEntity;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
import jakarta.persistence.criteria.Predicate;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Component
public class ProjectSpecification { public class ProjectSpecification {
public static Specification<ProjectEntity> searchByConditions( private final EntityManager entityManager;
private Set<String> stringFields;
public ProjectSpecification(EntityManager entityManager) {
this.entityManager = entityManager;
}
// 스프링 빈 초기화 후 실행
@PostConstruct
public void init() {
Metamodel metamodel = entityManager.getMetamodel();
EntityType<ProjectEntity> entityType = metamodel.entity(ProjectEntity.class);
// 문자열 타입 필드명만 추출
stringFields = entityType.getAttributes().stream()
.filter(attr -> attr.getJavaType().equals(String.class))
.map(Attribute::getName)
.collect(Collectors.toSet());
log.info("ProjectEntity string fields: {}", stringFields);
}
public Specification<ProjectEntity> searchByConditions(
String searchType, String keyword, String searchType, String keyword,
LocalDate startDate, LocalDate endDate) { LocalDate startDate, LocalDate endDate) {
return (root, query, cb) -> { return (root, query, cb) -> {
Predicate predicate = cb.conjunction(); Predicate predicate = cb.conjunction();
// 문자열 필드만 지정 (날짜 필드 제외)
Set<String> stringFields = Set.of("prjNm", "prjDesc", "delYn");
if (keyword != null && !keyword.isEmpty()) { if (keyword != null && !keyword.isEmpty()) {
if ("전체".equalsIgnoreCase(searchType) || "all".equalsIgnoreCase(searchType)) { if ("전체".equalsIgnoreCase(searchType) || "all".equalsIgnoreCase(searchType)) {
predicate = cb.and(predicate, cb.or( Predicate orPredicate = cb.disjunction();
cb.like(cb.lower(root.get("prjNm")), "%" + keyword.toLowerCase() + "%"), for (String field : stringFields) {
cb.like(cb.lower(root.get("prjDesc")), "%" + keyword.toLowerCase() + "%"), orPredicate = cb.or(orPredicate,
cb.like(cb.lower(root.get("delYn")), "%" + keyword.toLowerCase() + "%") cb.like(cb.lower(root.get(field)), "%" + keyword.toLowerCase() + "%"));
)); }
predicate = cb.and(predicate, orPredicate);
} else if (stringFields.contains(searchType)) { } else if (stringFields.contains(searchType)) {
predicate = cb.and(predicate, predicate = cb.and(predicate,
cb.like(cb.lower(root.get(searchType)), "%" + keyword.toLowerCase() + "%")); cb.like(cb.lower(root.get(searchType)), "%" + keyword.toLowerCase() + "%"));
} }
// searchType이 날짜 컬럼이면 keyword 검색 안함 // 날짜 타입 필드 검색 시 무시
} }
if (startDate != null) { if (startDate != null) {

Loading…
Cancel
Save