Фильтрация по двум параметрам в 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 сразу под два параметра

→ Ссылка