JPA 如何使用Join查詢和Distinct去重

假設(shè)有表OnlineOrder(訂單表)OnlineOrderDetail(訂單詳情表), 首先可以構(gòu)建 Specification, 在查詢時(shí),使用Join。

Specification<OnlineOrder> specification = (root, query, cb) -> {
            List<Predicate> predicates = Lists.newArrayList();
            // join構(gòu)建,默認(rèn)時(shí)inner join
            Join<OnlineOrder, OnlineOrderDetail> join = root.join("details");
            Predicate detailP1 = cb.isNull(join.get("afterSaleAt"));
            Predicate detailP2 = cb.equal(join.get("saleIsFinished").as(Boolean.class), true);
            predicates.add(cb.or(detailP1, detailP2));
           
            // distinct 去重
            query.distinct(true);

            // 已收貨訂單
            predicates.add(cb.equal(root.get("orderStatus").as(String.class), OnlineOrderStatus.received.name()));
            // 收貨時(shí)間早于7天前
            predicates.add(cb.lessThan(root.get("receivedAt").as(LocalDateTime.class), day7Ago));
            predicates.add(cb.isNull(root.get("billNo").as(String.class)));
            // 過濾掉不看的單子
            List<String> filters = criteria.getFilters();
            if (!CollectionUtils.isEmpty(filters)) {
                predicates.add(cb.not(root.get("orderNo").in(filters)));
            }

            Expression<LocalDateTime> createdAt = root.get("createdAt").as(LocalDateTime.class);
            // 開始時(shí)間
            if (criteria.getBeginTime() != null) {
                Predicate p = cb.greaterThanOrEqualTo(createdAt, criteria.getBeginTime().atStartOfDay());
                predicates.add(p);
            }

            // 結(jié)束時(shí)間
            if (criteria.getEndTime() != null) {
                Predicate p = cb.lessThanOrEqualTo(createdAt, criteria.getEndTime().atStartOfDay());
                predicates.add(p);
            }

            query.where(cb.and(predicates.toArray(new Predicate[0])));
            query.orderBy(cb.desc(createdAt));
            return query.getRestriction();
        };
        return specification;
    }

下面是使用代碼:

Specification<OnlineOrder> specification = this.buildSpecification(criteria);
return onlineOrderRepository.findAll(specification);

OnlineOrderRepository 代碼如下:

public interface OnlineOrderRepository extends JpaRepository<OnlineOrder, String>, JpaSpecificationExecutor<OnlineOrder> {
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容