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;
}
};
}