Фильтрация по двум параметрам в Spring Boot
Реализую отбор в таблице по двум значениям. Значение 1 - "designation" - указывается пользователям на странице вводом значения в input, Значение 2- "storage" прилетает сразу в url при открытии страницы (при переходе по qr коду к примеру ..../?storage=test1), при этом при открытии страницы идет отбор сначала по "storage", а потом пользователь в уже отобранных значениях отбирает по "designation"
Расширил репозитории:
package com.example.edu.repository;
import com.example.edu.models.Work;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
public interface WorkRepository extends JpaRepository <Work, Long>, JpaSpecificationExecutor<Work> {
}
Определил базовые предикаты в сервисе:
package com.example.edu.services;
import com.example.edu.models.Work;
import com.example.edu.repository.WorkRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.data.jpa.domain.Specification;
import java.util.List;
@Service
@Slf4j
@RequiredArgsConstructor
public class EditWorkServices {
private final WorkRepository workRepository;
public Specification<Work> getDesignation (String designation) {
return (root, cq, criteriaBuilder) -> {
if (designation == null) {
return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
} else {
return criteriaBuilder.equal(root.get("designation"), designation);
}
};
}
public Specification<Work> getStorage (String storage) {
return (root, query, criteriaBuilder) -> {
if (storage == null) {
return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
} else {
return criteriaBuilder.equal(root.get("storage"), storage);
}
};
}
А дальше не понимаю как вывести все в контроллер.
package com.example.edu.controller;
import com.example.edu.models.Work;
import com.example.edu.services.EditWorkServices;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@Controller
public class ProjectController {
private final EditWorkServices editWorkServices;
public ProjectController (EditWorkServices editWorkServices) {
this.editWorkServices = editWorkServices;
}
@GetMapping ("/")
public String works (@RequestParam (name = "designation", required = false) String designation, @RequestParam (name = "storage", required = false) String storage, Model model) {
// model.addAttribute(editWorkServices.getDesignation(designation));
// model.addAttribute(editWorkServices.getStorage(storage));
return "works";
}
Ответы (1 шт):
Сам по себе Specification не лезет в БД. Это подготовка фильтра.
Попробуйте в EditWorkServices сделать метод с обращением в репозиторий:
workRepository.findAll(getStorage(String)) а потом уже полученый список отфильтруйте по designation.
Как понимаю getDesignation вам и не нужен
Или сделайте общую Specification сразу под два параметра