37 lines
1.5 KiB
Java
37 lines
1.5 KiB
Java
package de.ph87.homeautomation;
|
|
|
|
import jakarta.persistence.criteria.Expression;
|
|
import jakarta.persistence.criteria.Predicate;
|
|
import org.springframework.data.domain.PageRequest;
|
|
import org.springframework.data.domain.Sort;
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
import java.util.function.Function;
|
|
|
|
public class RepositorySearchHelper {
|
|
|
|
public static <T, D> List<D> search(final String term, final JpaSpecificationExecutor<T> repository, final String fieldName, final Function<T, D> map) {
|
|
final Specification<T> specification = (root, query, criteriaBuilder) -> {
|
|
final Expression<String> field = criteriaBuilder.lower(root.get(fieldName));
|
|
final String term2 = term
|
|
.replaceAll("([a-zA-Z])([0-9])", "$1 $2")
|
|
.replaceAll("([0-9])([a-zA-Z])", "$1 $2")
|
|
.replaceAll("([A-Z])([A-Z])", "$1 $2")
|
|
.replaceAll("([a-z])([A-Z])", "$1 $2")
|
|
.toLowerCase(Locale.ROOT);
|
|
final List<Predicate> predicates = Arrays.stream(term2.split("\\s"))
|
|
.filter(word -> !word.isEmpty())
|
|
.map(word -> criteriaBuilder.like(field, "%" + word + "%"))
|
|
.toList();
|
|
return criteriaBuilder.and(predicates.toArray(Predicate[]::new));
|
|
};
|
|
final PageRequest pageRequest = PageRequest.of(0, 20, Sort.by(Sort.Direction.ASC, fieldName));
|
|
return repository.findAll(specification, pageRequest).stream().map(map).toList();
|
|
}
|
|
|
|
}
|