REST API фильтр по критериям

Возвращается не правильный результат при запросе GET /rest/players с параметрами banned, minLevel и maxLevel. Как видно из результата теста не возвращает ничего А также интересует как реквест бади контроллера можно сократить?

Expected :[PlayerInfoTest{id=12, name='Фаэрвин', birthday=2010-09-06}, PlayerInfoTest{id=14, name='Джур', birthday=2009-07-14}, PlayerInfoTest{id=25, name='Тант', birthday=2010-10-03}]
Actual   :[]

Прошу помочь , почему так происходит, вот код

public class PlayerSort {
public static Specification<Player> findPlayerByName(final String name) {
        return (r, cq, cb) -> cb.like(r.get("name"), "%" + name + "%");
    }

    public static Specification<Player> findPlayerByTitle(final String title) {
        return (r, cq, cb) -> cb.like(r.get("title"), "%" + title + "%");
    }

    public static Specification<Player> findPlayerByRace(final Race race) {
        if (race == null)
            return null;
        return (r, cq, cb) -> cb.equal(r.get("race"), race);
    }

    public static Specification<Player> findPlayerByProfession(final Profession profession) {
        if (profession == null)
            return null;
        return (r, cq, cb) -> cb.equal(r.get("profession"), profession);
    }

    public static Specification<Player> findPlayerByStatus(final Boolean banned) {
        if (banned == null)
            return null;
        return (r, cq, cb) -> cb.equal(r.get("banned"), banned);
    }

    public static Specification<Player> findPlayerByDate(final Long after, final Long before) {
        return (r, cq, cb) -> {
            if (after == null && before != null) {
                return cb.lessThanOrEqualTo(r.get("birthday"), new Date(before));
            }
            if (after != null && before == null) {
                return cb.greaterThanOrEqualTo(r.get("birthday"), new Date(after));
            }
            if (after != null && before != null) {
                return cb.and(cb.greaterThanOrEqualTo(r.get("birthday"), new Date(after)), cb.lessThanOrEqualTo(r.get("birthday"), new Date(before)));
            }
            return null;
        };
    }

    public static Specification<Player> findPlayerByExp(final Integer experienceMin, final Integer experienceMax) {
        return (r, cq, cb) -> {
            if (experienceMin == null && experienceMax != null) {
                return cb.lessThanOrEqualTo(r.get("experience"), new Date(experienceMax));
            }
            if (experienceMin != null && experienceMax == null) {
                return cb.greaterThanOrEqualTo(r.get("experience"), new Date(experienceMin));
            }
            if (experienceMin != null && experienceMax != null) {
                return cb.and(cb.greaterThanOrEqualTo(r.get("experience"), new Date(experienceMin)), cb.lessThanOrEqualTo(r.get("birthday"), new Date(experienceMax)));
            }
            return null;
        };
    }

    public static Specification<Player> findPlayerByMinLevel(final Integer levelMin) {
        if (levelMin == null)
            return null;
        return (r, cq, cb) -> cb.equal(r.get("level"), levelMin);
    }

    public static Specification<Player> findPlayerByMaxLevel(final Integer levelMax) {
        if (levelMax == null)
            return null;
        return (r, cq, cb) -> cb.equal(r.get("level"), levelMax);
    }

Контроллер

@Controller

@RequestMapping("/rest/players")

@RequiredArgsConstructor

public class PlayerController {

private final PlayerService playerService;
@RequestMapping(value = "", method = RequestMethod.GET, produces = 
MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<Player>> getAllPlayers(@RequestParam(required = false, defaultValue = "0") Integer pageNumber,
                                                      @RequestParam(required = false, defaultValue = "3") Integer pageSize,
                                                      @RequestParam(required = false, defaultValue = "ID") PlayerOrder order,
                                                      @RequestParam(required = false, defaultValue = "") String name,
                                                      @RequestParam(required = false, defaultValue = "") String title,
                                                      @RequestParam(required = false, defaultValue = "") Race race,
                                                      @RequestParam(required = false, defaultValue = "") Profession profession,
                                                      @RequestParam(required = false, defaultValue = "") Boolean banned,
                                                      @RequestParam(required = false, defaultValue = "") Long after,
                                                      @RequestParam(required = false, defaultValue = "") Long before,
                                                      @RequestParam(required = false, defaultValue = "") Integer minExperience,
                                                      @RequestParam(required = false, defaultValue = "") Integer maxExperience,
                                                      @RequestParam(required = false, defaultValue = "") Integer minLevel,
                                                      @RequestParam(required = false, defaultValue = "") Integer maxLevel) {
        Sort sort = null;
        switch (order) {
            case ID:
                sort = Sort.by("id");
                break;
            case NAME:
                sort = Sort.by("name");
                break;
            case EXPERIENCE:
                sort = Sort.by("experience");
                break;
            case BIRTHDAY:
                sort = Sort.by("birthday");
                break;
        }

        PageRequest pageRequest = PageRequest.of(pageNumber, pageSize, sort);
        List<Player> players = playerService.searchByCriterias(name, title, race, profession, banned, after, before,
                minExperience, maxExperience, minLevel, maxLevel, pageRequest).toList();

        return new ResponseEntity<>(players, HttpStatus.OK);
    }

Сервис

@Slf4j

@Service

@RequiredArgsConstructor

public class PlayerServiceImpl implements PlayerService { private final PlayerDAO playerDAO;

@Override
public Page<Player> searchByCriterias(String name, String title,
                                      Race race, Profession profession,
                                      Boolean banned,
                                      Long after, Long before,
                                      @RequestParam(required = false, defaultValue = "") Integer experienceMin,
                                      @RequestParam(required = false, defaultValue = "") Integer experienceMax,
                                      @RequestParam(required = false, defaultValue = "") Integer levelMin,
                                      @RequestParam(required = false, defaultValue = "") Integer levelMax,
                                      Pageable pageable
) {
    return playerDAO.findAll(PlayerSort.findPlayerByName(name)
            .and(PlayerSort.findPlayerByRace(race))
            .and(PlayerSort.findPlayerByProfession(profession))
            .and(PlayerSort.findPlayerByStatus(banned))
            .and(PlayerSort.findPlayerByTitle(title))
            .and(PlayerSort.findPlayerByDate(after, before))
            .and(PlayerSort.findPlayerByExp(experienceMin, experienceMax))
            .and(PlayerSort.findPlayerByMaxLevel(levelMax))
            .and(PlayerSort.findPlayerByMinLevel(levelMin)), pageable);
}

Как лямбдой записать то же самое? Кажется проблема в них, потому что такой код работает:

public static Specification<Player> findPlayerByExp(final Integer experienceMin,final Integer experienceMax) {
        return new Specification<Player>() {

        @Override
        public Predicate toPredicate(Root<Player> root,
                                     CriteriaQuery<?> criteriaQuery,
                                     CriteriaBuilder criteriaBuilder) {

            Predicate less;
            Predicate greater;

            if(experienceMin == null && experienceMax != null){
                less = criteriaBuilder.lessThanOrEqualTo(root.get("experience"),experienceMax);
                return less;
            }
            if(experienceMin != null && experienceMax == null){
                greater = criteriaBuilder.greaterThanOrEqualTo(root.get("experience"),experienceMin);
                return greater;
            }
            if(experienceMax != null && experienceMin != null) {
                greater = criteriaBuilder.greaterThanOrEqualTo(root.get("experience"), experienceMin);
                less = criteriaBuilder.lessThanOrEqualTo(root.get("experience"), experienceMax);
                return criteriaBuilder.and(greater, less);
            }

            return null;
        }
    };
}

public static Specification<Player> findPlayerByMinLevel(final Integer levelMin) {
        return new Specification<Player>() {
        @Override
        public Predicate toPredicate(Root<Player> root,
                                     CriteriaQuery<?> criteriaQuery,
                                     CriteriaBuilder criteriaBuilder) {

            if(levelMin == null)
                return null;

            Predicate greater = criteriaBuilder.greaterThanOrEqualTo(root.get("level"),levelMin);
            return greater;
        }
    };
}

Ответы (0 шт):