spring boot中Specification查询 分页查询

每天一篇之spring boot中Specification查询 分页查询

在使用JPA过程中,很多时候都涉及复杂查询,其中一种就是Specification,使用的方法如下:
第一步:先在仓库层加入JpaSpecificationExecutor

/**
 * Created by w on 2019/1/9.
 */
@Repository
public interface QuoteRepository extends JpaRepository<Quote, Long> ,JpaSpecificationExecutor<Quote> {
    @Query("select count(id) from Quote q where q.demand.id = :demandId")
    Long countByDemandId(@Param("demandId")Long demandId);
}

第二步:编写查询条件

@Override
    @Transactional
    public JSONObject showQuotes(Map params) {
    	//这部分是查询条件
        String page = (String) params.get("page");
        String size = (String) params.get("size");
        PageUtil.isPageAndSize(page, size);
        int intPage = Integer.parseInt(page) - 1;
        int intSize = Integer.parseInt(size);
        String isRead = (String) params.get("isRead");
        String stime = (String) params.get("stime");
        String etime = (String) params.get("etime");
        Long companyId = ((CustomerInfo) SecurityUtil.getSecurityDetail().getSecurityUser()).getCompanyId();
        Pageable pageable = PageRequest.of(intPage, intSize, new Sort(Sort.Direction.DESC, "id"));
        Specification<Quote> specification = new Specification<Quote>()
        {
            @Nullable
            @Override
            public javax.persistence.criteria.Predicate toPredicate(Root<Quote> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            	//查询条件集合
                List<Predicate> predicates = new ArrayList<>();
                if (StringUtils.isNotBlank(stime)) {
                    //大于或等于传入时间
                    predicates.add(cb.greaterThanOrEqualTo(root.get("quoteTime").as(String.class), stime));
                }
                if (StringUtils.isNotBlank(etime)) {
                    //小于或等于传入时间
                    predicates.add(cb.lessThanOrEqualTo(root.get("quoteTime").as(String.class), etime));
                }
                if(StringUtils.isNotBlank(isRead))
                {
                	//相等
                    predicates.add(cb.equal(root.get("isRead"),isRead));
                }
                predicates.add(cb.equal(root.get("companyId"),companyId));
                return cb.and(predicates.toArray(new javax.persistence.criteria.Predicate[predicates.size()]));
            }
        };
        Page<Quote> quotePage = quoteRepository.findAll(specification, pageable);
        //以下都是业务代码,,无须理会
        List<QuoteListDto> dtos = new ArrayList<>();
        quotePage.getContent().forEach(quote -> {
            QuoteListDto dto = new QuoteListDto();
            dto.setQuoteId(quote.getId());
            dto.setQuoteTime(quote.getQuoteTime());
            dto.setTotalPrice(quote.getTotalPrice());
            dto.setDemandId(quote.getDemand().getId());
            dto.setDemandTitle(quote.getDemand().getTitle());
            dto.setQuote(getStringStatus(quote.getDemand().getQuote()));
            dtos.add(dto);
        });
        return PageUtil.getPageDto(quotePage,dtos);
    }

猜你喜欢

转载自blog.csdn.net/wgxu123/article/details/87918957
今日推荐