Весенняя загрузка данных с фильтрацией List / Set - PullRequest
0 голосов
/ 22 февраля 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) Set<Competence> competences,
            @RequestParam(required = false) Set<UserRole> roles,
            @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);
    }

Это сервисная функция:

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> roles(Set<UserRole> roles) {
        return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("user").get("roles"), roles);
    }

В настоящее время, когда я отправляю объекты ролей из моего внешнего интерфейса, он отправляет их в виде строки, а при загрузке Spring выдает ошибку Failed to convert value of type 'java.Lang.String' to required type 'java.util.Set'

1 Ответ

0 голосов
/ 22 февраля 2019

вы пытаетесь создать запрос типа

выберите * из таблицы, где роли равны 'a', 'b', 'c'

это недопустимый запрос.

для решения вашей проблемы используйте в

criteriaBuilder.in(root.get("user").get("roles"), roles)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...