parent
de4c61ee3b
commit
ec874ff622
@ -0,0 +1,72 @@
|
||||
package kr.re.etri.autoflow.specification;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.metamodel.Attribute;
|
||||
import jakarta.persistence.metamodel.EntityType;
|
||||
import jakarta.persistence.metamodel.Metamodel;
|
||||
import kr.re.etri.autoflow.entity.ProjectEntity;
|
||||
import kr.re.etri.autoflow.entity.WorkflowEntity;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import jakarta.persistence.criteria.Predicate;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class WorkflowSpecification {
|
||||
|
||||
private final EntityManager entityManager;
|
||||
|
||||
private Set<String> stringFields;
|
||||
|
||||
public WorkflowSpecification(EntityManager entityManager) {
|
||||
this.entityManager = entityManager;
|
||||
}
|
||||
|
||||
// 스프링 빈 초기화 후 실행
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
Metamodel metamodel = entityManager.getMetamodel();
|
||||
EntityType<WorkflowEntity> entityType = metamodel.entity(WorkflowEntity.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<WorkflowEntity> searchByConditions(
|
||||
String searchType, String keyword) {
|
||||
|
||||
return (root, query, cb) -> {
|
||||
Predicate predicate = cb.conjunction();
|
||||
|
||||
if (keyword != null && !keyword.isEmpty()) {
|
||||
if (searchType == null || searchType.isEmpty() ||
|
||||
"전체".equalsIgnoreCase(searchType) || "all".equalsIgnoreCase(searchType)) {
|
||||
Predicate orPredicate = cb.disjunction();
|
||||
for (String field : stringFields) {
|
||||
orPredicate = cb.or(orPredicate,
|
||||
cb.like(cb.lower(root.get(field)), "%" + keyword.toLowerCase() + "%"));
|
||||
}
|
||||
predicate = cb.and(predicate, orPredicate);
|
||||
|
||||
} else if (stringFields.contains(searchType)) {
|
||||
predicate = cb.and(predicate,
|
||||
cb.like(cb.lower(root.get(searchType)), "%" + keyword.toLowerCase() + "%"));
|
||||
}
|
||||
// 날짜 타입 필드 검색 시 무시
|
||||
}
|
||||
|
||||
return predicate;
|
||||
};
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue