JPA 原生多表查詢分頁

CONTRLLOE

    @GetMapping("findByCondition")
    public ResponseEntity findByCondition(@ModelAttribute PaymentEntity paymentEntity, @RequestParam int page, @RequestParam int size) {
        Page result = paymentFacade.findByCondition(paymentEntity, page, size);
        return ResponseEntity.ok(result);
    }

 

IMP

public interface PaymentFacade {
    Page findByCondition(PaymentEntity paymentEntity, int page, int size);

}

 

 

IMPL

 @Override
    public Page findByCondition(PaymentEntity paymentEntity, int page, int size) {

        StringBuilder sb = new StringBuilder();
        StringBuilder condition = new StringBuilder();
        StringBuilder sum = new StringBuilder();
        sb.append("select e.* from payment e left join state_machine s on e.id =s.machine_id where 1=1 ");
        sum.append("select count(1) from payment e left join state_machine s on e.id =s.machine_id where 1=1 ");

        if (paymentEntity.getStartDate() != null  ) {
            condition.append(" and e.start_date >= '"+ DateUtils.format(paymentEntity.getStartDate(),"yyyy-MM-dd")+"' ");
        }
        if (paymentEntity.getEndDate() != null  ) {
            condition.append(" and e.end_date <= '"+ DateUtils.format(paymentEntity.getEndDate(),"yyyy-MM-dd")+"' ");
        }
        if (StringUtils.isNotBlank(paymentEntity.getPaymentNo())) {
            condition.append(" and e.payment_no like '%" + paymentEntity.getPaymentNo() + "%'");
        }
        if (StringUtils.isNotBlank(paymentEntity.getState())) {
            condition.append(" and s.state = '" + paymentEntity.getState() + "'");
        }
        if (StringUtils.isNotBlank(paymentEntity.getCustomerId())) {
            condition.append(" and s.customer_id = '" + paymentEntity.getCustomerId() + "'");
        }
        if (StringUtils.isNotBlank(paymentEntity.getSupplyOrgId())) {
            condition.append(" and s.supply_org_id = '" + paymentEntity.getSupplyOrgId() + "'");
        }


        sum.append(condition);
        sb.append(condition).append(" order by id desc limit " + (page) * size + "," + size);
        int count = ((BigInteger) entityManager.createNativeQuery(sum.toString()).getSingleResult()).intValue();
        if (count < 1) {
            return null;
        }
        Query query = entityManager.createNativeQuery(sb.toString(), PaymentEntity.class);
        PageRequest pageRequest = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "id"));
        List<PaymentEntity> list = query.getResultList();
        return new PageImpl<PaymentEntity>(list, pageRequest, count);
    }

 

 

TEST

 

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