【问题标题】:Spring boot data filtering with List/Set使用 List/Set 进行 Spring Boot 数据过滤
【发布时间】:2019-07-16 05:00:27
【问题描述】:

我有一个表格,其中显示姓名、电子邮件等,但也列出了某个用户拥有的角色或能力。

我在使用角色数组过滤表格时遇到问题。一个用户可以有多个角色,下表显示了这一点。我需要能够通过选择例如两个角色进行过滤:“服务经理”和“物流经理”。服务器响应应该是所有具有这些角色的用户。

获取过滤用户的控制器函数:

@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 boot 会引发错误 Failed to convert value of type 'java.Lang.String' to required type 'java.util.Set'

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    你试图创建一个类似的查询

    从角色等于 'a','b','c' 的表中选择 *

    这是无效的查询。

    用于解决您的问题

    criteriaBuilder.in(root.get("user").get("roles"), roles)
    

    【讨论】:

    • 感谢您的回答!将我的规范更改为它现在说:在标准构建器中的 (Expression>) 不能应用于 (Path)
    • 表达式属性= root.get("user").get("roles"); attribute.in((Set) roles) 你需要这样的东西
    • 不是真的,属性=后面的“根”表示“无法解析符号根”
    猜你喜欢
    • 2021-05-15
    • 2016-02-12
    • 2017-04-23
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2021-11-13
    • 2018-01-15
    相关资源
    最近更新 更多