JPA 多表左連接多條件分頁查詢

業務場景:

 主表:訂單表,與客戶表、產品表、物流表存在一對一關係,映射字段爲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);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章