業務場景:
主表:訂單表,與客戶表、產品表、物流表存在一對一關係,映射字段爲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 和 pageNum進行創建
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);
}