Advertisement

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);
    
     }

全部评论 (0)

还没有任何评论哟~