CriteriaBuilder, params: поиск пользователей с конкретными объектами - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь отфильтровать своих пользователей по компетенциям (лицензии и прочее).Сейчас я экспериментирую с разными возможностями, но думаю, что застрял и ищу помощи.

@PreAuthorize("hasAuthority('service_manager')")
    @RequestMapping(path = "/workers", method = RequestMethod.GET)
    public Page<WorkDetailResponse> getWorkers(
            @RequestParam(defaultValue = "0") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) BigInteger phone,
            @RequestParam(required = false) String email,
            @RequestParam(required = false) String competences,
            @RequestParam(required = false) User.UserStatus status,
            @RequestParam(defaultValue = "createTime") String sort,
            @RequestParam(defaultValue = "desc") String sortDir
            ){

        WorkDetailListRequest request = new WorkDetailListRequest(name, phone, email, competences, roles, status);

        Sort.Direction direction;

        if (sortDir.equals("asc")) {
            direction = Sort.Direction.ASC;
        } else {
            direction = Sort.Direction.DESC;
        }

        return workDetailService.getWorkDetails(request, of(page, size, direction, sort))
                .map(WorkDetailResponse::new);
    }

Компетенции работника - это на самом деле объекты Set [] Компетентности, один работникможет иметь много компетенций.

public Page<WorkDetail> getWorkDetails(WorkDetailListRequest request, Pageable pageable) {
        Specification<WorkDetail> spec = where(null);

        if (request.getName() != null) spec = spec.and(name(request.getName()));
        if (request.getPhone() != null) spec = spec.and(phoneOne(request.getPhone()));
        if (request.getEmail() != null) spec = spec.and(email(request.getName()));
        if (request.getCompetences() != null) spec = spec.and(competences(request.getCompetences()));
        if (request.getRoles() != null) spec = spec.and(roles(request.getRoles()));
        if (request.getStatus() != null) spec = spec.and(status(request.getStatus()));

        return workDetailRepository.findAll(spec, pageable);
    }

В настоящее время я использую эту спецификацию.

public static Specification<WorkDetail> competences(String competences){
    return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("competences").get("name"), competences);
}

Идея заключалась в том, что с помощью параметров из скажем:

http://localhost:8080/workers?competences=A&competences=B&competences=C

приложение найдет всех работников с компетенциями A, B и C

Прямо сейчас я получаю эту ошибку: Illegal attempt to dereference path source [null.competences] of basic type;, но я все равно делаю это неправильно.Кто-нибудь делал это раньше?

Компетенция и WorkDetail находятся в отношениях многих ко многим

1 Ответ

0 голосов
/ 01 марта 2019

Если вы хотите разрешить несколько компетенций в запросе, тогда getCompetences () должен вернуть List<String>

Ваш метод компетенций также должен иметь тот же тип аргумента, и вместо equal вы должны использоватьin при создании критерия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...