Как использовать результаты подзапроса CriteriaQuery в другом запросе - PullRequest
0 голосов
/ 26 июня 2019

У меня есть следующий метод, который агрегирует общую сумму выставления счетов по всем транзакциям, которые соответствуют критериям спецификации (параметрам поиска), переданным в предложение where.

Это работает нормально, пока не будет использован параметр поиска позиции.Затем общая сумма выставления счета дублируется в зависимости от количества связанных позиций.Это как-то связано с тем, что я использую BigDecimal в качестве класса запросов.Если я использую транзакцию, результаты различны, но я не могу суммировать общую сумму выставления счета.

public BigDecimal sumBillingAmount(TransactionReportFilteredRequest request) {

        final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        final CriteriaQuery<BigDecimal> query = cb.createQuery(BigDecimal.class);
        Root<Transaction> root = query.from(Transaction.class);

        Specification<Transaction> tranSpec = TransactionSpecification.webFilteringSearch(request.getUserLogNo(), request.getRefNo(), 
                request.getBillingDateFrom(), request.getBillingDateTo(), request.getTransactionDateFrom(), request.getTransactionDateTo(),
                request.getFund(), request.getMinTotalChargeAmt(), request.getMaxTotalChargeAmt(), request.getStatus(), request.getCardId(), 
                request.getUserId(), request.getCompanyName(), request.getCenters());

        query.select(cb.sum(root.<BigDecimal> get(Transaction_.TOTAL_BILLING_AMT)))
            .where(tranSpec.toPredicate(root, query, cb));

        final TypedQuery<BigDecimal> typedQuery = entityManager.createQuery(query);
        return typedQuery.getSingleResult();
    }

Я думал об использовании подзапроса для получения отдельных объектов Transaction, но не смог понять, как использовать подзапрос в моем начальном запросе.

Subquery<Transaction> subquery = query.subquery(Transaction.class);
        Root<Transaction> subroot = query.from(Transaction.class);

        Specification<Transaction> tranSpec = TransactionSpecification.webFilteringSearch(request.getUserLogNo(), request.getRefNo(), 
                request.getBillingDateFrom(), request.getBillingDateTo(), request.getTransactionDateFrom(), request.getTransactionDateTo(),
                request.getFund(), request.getMinTotalChargeAmt(), request.getMaxTotalChargeAmt(), request.getStatus(), request.getCardId(), 
                request.getUserId(), request.getCompanyName(), request.getCenters());

        subquery.select(subroot)
            .where(tranSpec.toPredicate(root, query, cb));

Я пробовал несколько способовиспользовать подзапрос в основном запросе, но безуспешно.

Кто-нибудь знает, как использовать подзапрос в запросе?

...