JPA多表左接続多条件ページングクエリ


ビジネスシーン:
メインテーブル:受注テーブル、顧客テーブル、製品テーブル、物流テーブルと一対一の関係があり、マッピングフィールドはidであり、現在、受注番号、受注日、顧客名、顧客番号、製品名、製品番号、速達単号に基づいてこの受注を照会する必要があり、曖昧な照会とページングをサポートする必要がある.
Orderエンティティークラスでは、1対1のリレーションシップマッピングが必要です.
    @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の2つのインタフェースを継承する必要があります.
@Repository
public interface OrderDao extends JpaRepository, JpaSpecificationExecutor {
}

サービスの書き方:
Pageableは、フロントエンドから送信されたpageSizeとpageNumによって作成されます.
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
    @Autowired
    OrderDao licenseDao;

    @Autowired
    KeyPairService keyPairService;

    public Page getLicenseList(Order order, Pageable pageable) {
        Specification specification = new Specification() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List list = new ArrayList();
                Join expressJoin = root.join("express", JoinType.LEFT);
                Join proJoin = root.join("product", JoinType.LEFT);
                Join 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);
    }