通过字段搜索规范查找弹簧靴

问题描述 投票:0回答:1

我的问题是我可以从数据库中搜索。但是我确实使用findAllJpaSpecificationExecutor进行搜索。但是,我想使用findById进行搜索,并将specificationpageableid传递给它返回page。但这是行不通的。

这里是我的controller

    @GetMapping(value = "/search")
    public ResponseEntity<ResponseDTO> allAccountRightService(
                    @RequestParam(value = "search", required = false) String search,
                    @RequestParam(value = "page", required = false) Integer page,
                    @RequestParam(value = "size", required = false) Integer size,
                    @RequestParam(value = "order", required = false) String order,
                    @RequestParam(value = "orderBy", required = false) String orderBy) {
        ResponseDTO responseDTO = new ResponseDTO("accountRightService List", accountRightService.search(search, page, size, order, orderBy));

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

and here is my `service impl` method:

public Map<PageInformation, List<AccountRightDTO>> search(String search, Integer page, Integer size, String order,
            String orderBy) {
        Map<PageInformation, List<AccountRightDTO>> accountRightList = new HashMap<>();

        PageInformation pageInfo = new PageInformation();

        if (order == null || order.isEmpty())
            order = "DESC";

        if (orderBy == null || orderBy.isEmpty())
            orderBy = "createdAt";


        Pageable pageable = CommonUtil.createPageRequest(page, size, order, orderBy);

        Specification<AccountRight> spec = CommonUtil.buildSearchSpecification(search);
        //Page<AccountRight> accountRightPage = accountRightRepository.findAllByRightByAppointment(CommonUtil.getAppointment().getAppointmentID(), spec, pageable);
        Page<AccountRight> accountRightPage = accountRightRepository.findAll(spec, pageable);
        List<AccountRight> accountRights = accountRightPage.getContent();

        List<AccountRightDTO> accountRightDTOs = new ArrayList<>();
        accountRightDTOs = accountRights.stream().map(accountRight -> {
            AccountRightDTO accountRightDTO = new AccountRightDTO();
            AppointmentDTO rightToAppointmentDTO = new AppointmentDTO();
            AppointmentDTO rightByAppointmentDTO = new AppointmentDTO();

            BeanUtils.copyProperties(accountRight, accountRightDTO, "accountRightID");

            accountRightDTO.setAccountRightID(Long.toString(accountRight.getAccountRightID()));


            BeanUtils.copyProperties(accountRight.getRightToAppointment(), rightToAppointmentDTO, "appointmentID");
            rightToAppointmentDTO.setAppointmentID(Long.toString(accountRight.getRightToAppointment().getAppointmentID()));

            BeanUtils.copyProperties(accountRight.getRightByAppointment(), rightByAppointmentDTO, "appointmentID");
            rightByAppointmentDTO.setAppointmentID(Long.toString(accountRight.getRightToAppointment().getAppointmentID()));

            accountRightDTO.setRightByAppointment(rightByAppointmentDTO);
            accountRightDTO.setRightToAppointment(rightToAppointmentDTO);

            return accountRightDTO;
        }).collect(Collectors.toList());

        pageInfo.setSize(accountRightPage.getSize());
        pageInfo.setTotalElements(accountRightPage.getTotalElements());
        pageInfo.setTotalPages(accountRightPage.getTotalPages());

        accountRightList.put(pageInfo, accountRightDTOs);
        return accountRightList;
    }

这是我的buildsearchspecification方法

public static <T> Specification<T> buildSearchSpecification(String search) {

        SearchSpecificationsBuilder<T> builder = new SearchSpecificationsBuilder<T>();

        if (search != null && !search.isEmpty()) {
            String[] str = search.split(",");
            if (str != null) {
                for (String strTemp : str) {
                    Pattern pattern = Pattern.compile("(\\p{Punct}?)(.*)(:|!|<|>|~)(.*)(\\p{Punct}?),");
                    Matcher matcher = pattern.matcher(strTemp + ",");
                    while (matcher.find()) {
                        builder.with(matcher.group(1), matcher.group(2),
                                SearchOperation.getSimpleOperation(matcher.group(3).toCharArray()[0]),
                                matcher.group(4));
                    }
                }
            }
        }

        Specification<T> spec = builder.build();
        return spec;
    }

这是我的findAllByRightByAppointment存储库方法

@Query("select account from AccountRight account where account.rightByAppointment.appointmentID=?1")
    Page<AccountRight> findAllByRightByAppointment(Long appointmentID, @Nullable Specification<AccountRight> spec, Pageable pageable);

[如果我使用findAll方法,则搜索将可以通过使用自定义方法进行,否则,pagination可以在没有searching的情况下工作

java spring spring-boot spring-data-jpa specifications
1个回答
0
投票

我使用Specification.Where(your_specification).and(your_search_specification).找到了答案

现在是我的更新代码:

Specification<AccountRight> searchSpec = CommonUtil.buildSearchSpecification(search); //this specification needs my search string.
        SearchSpecification<AccountRight> rightByAppointmentID = 
                  new SearchSpecification<AccountRight>(new SearchCriteria("rightByAppointment.appointmentID", SearchOperation.EQUALITY, CommonUtil.getAppointment().getAppointmentID())); //this specification accepts search criteria with key, operation and value.


        Page<AccountRight> accountRightPage = accountRightRepository.findAll(Specification.where(rightByAppointmentID).and(searchSpec), pageable); 

//here you will just tell findAll method to findAll entities where rightByAppointmentID is equal to
   //CommonUtil.getAppointment().getAppointmentID() and search query is searchSpec
© www.soinside.com 2019 - 2024. All rights reserved.