業務場景:
主表:訂單表,與客戶表、產品表、物流表存在一對一關係,映射字段爲id,現需要根據訂單編號、訂單日期、客戶名稱、客戶編號、產品名稱、產品編號、快遞單號查詢該筆訂單,需要支持模糊查詢和分頁。
Order實體類中的需要進行一對一關係映射:
@OneToOne
@JoinColumn(name = "express_id")
private Express express;
@OneToOne
@JoinColumn(name = "product_id")
private Product product;
@OneToOne
@JoinColumn(name = "customer_id")
private Customer customer;
Dao中的需要繼承JpaRepository,JpaSpecificationExecuto兩個接口:
@Repository
public interface OrderDao<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
}
Service中的寫法:
Pageable通過前端傳入的pageSize 和 pageNumber進行創建
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
@Autowired OrderDao licenseDao; @Autowired KeyPairService keyPairService; public Page<Order> getLicenseList(Order order, Pageable pageable) { Specification<License> specification = new Specification<Order>() { @Override public Predicate toPredicate(Root<License> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> list = new ArrayList<Predicate>(); Join<Order, Express> expressJoin = root.join("express", JoinType.LEFT); Join<Order, Product> proJoin = root.join("product", JoinType.LEFT); Join<Order, Customer> customerJoin = root.join("customer", JoinType.LEFT); if (null != order.getCustomer() && !StringUtils.isEmpty(order.getCustomer().getCode())) { list.add(criteriaBuilder.like(customerJoin.get("code").as(String.class), "%" + order.getCustomer().getCode() + "%")); } if (null != order.getCustomer() && !StringUtils.isEmpty(order.getCustomer().getName())) { list.add(criteriaBuilder.like(customerJoin.get("name").as(String.class), "%" + order.getCustomer().getName() + "%")); } if (null != order.getProduct() && !StringUtils.isEmpty(order.getProduct().getCode())) { list.add(criteriaBuilder.like(proJoin.get("code").as(String.class), "%" + order.getProduct().getCode() + "%")); } if (null != order.getProduct() && !StringUtils.isEmpty(order.getProduct().getName())) { list.add(criteriaBuilder.like(proJoin.get("name").as(String.class), "%" + order.getProduct().getName() + "%")); } if (null != order.getExpress() && !StringUtils.isEmpty(order.getExpress().getCode())) { list.add(criteriaBuilder.like(expressJoin.get("code").as(String.class), "%" + order.getExpress().getCode() + "%")); } if (!StringUtils.isEmpty(order.getCode())) { list.add(criteriaBuilder.like(root.get("code").as(String.class), "%" + order.getCode() + "%")); } if (null != order.getCreateDate()) { list.add(criteriaBuilder.lessThan(root.get("createDate").as(Date.class), order.getCreateDate())); } Predicate[] p = new Predicate[list.size()]; return criteriaBuilder.and(list.toArray(p)); } }; return orderDao.findAll(specification, pageable); }