每天一篇之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);
}