Можно ли использовать вложенные проекции в JPA?

Получая массив определённых счётов из БД, для каждого в цикле выполняется ещё один запрос на получение его транзакций через проекцию XQuery:

@Query(value =
        "select sum(txd.unit_amount) as amount, (0.9) as price, t.course as course " +
        "   from transactions t                                                    " +
        "            join transaction_x_details txd on t.id = txd.transaction_id   " +
        "            join accounts a on t.account_id = a.id                        " +
        "   where a.id = :accountId                                                " +
        "     and t.operation_type = 10                                            " +
        "     and t.created_at between :dateFrom and :dateTo                       " +
        "   group by course                                                        ",
        nativeQuery = true)
    List<XQuery> findAllFromXByAccountIdAndPeriod(Long accountId, LocalDateTime dateFrom, LocalDateTime dateTo);

Проекция имеет следующий вид:

public interface XQuery {
    Long getAmount();
    BigDecimal getPrice();
    BigDecimal getCourse();
}

Было бы здорово сразу выгрузить все данные одним запросом по типу:

    @Query(value =
        "select \"xQuery\", \"customerInn\"                                                                    " +
        "from (select sum(tmd.unit_amount) as amount, (p.value * t.course) as price, cs.inn as \"customerInn\" " +
        "      from transactions t                                                                             " +
        "               join transaction_x_details tmd on t.id = tmd.transaction_id                            " +
        "               join accounts a on t.account_id = a.id                                                 " +
        "               join categories ct on ct.id = a.category_id                                            " +
        "               join customers cs on cs.id = a.customer_id                                             " +
        "               join prices p on ct.price_id = p.id                                                    " +
        "      where a.id in (:accountsId)                                                                     " +
        "        and t.operation_type = 10                                                                     " +
        "        and t.created_ts between :dateFrom and :dateTo                                                " +
        "      group by price, \"customerInn\") as \"xQuery\"                                                  " +
        "group by \"xQuery\", \"customerInn\"                                                                  ",
        nativeQuery = true)
    List<XPackageQuery> findAllFromXByPeriodAndAccountIdIn(List<Long> accountsId,
                                                           LocalDateTime dateFrom,
                                                           LocalDateTime dateTo);

А в данном случае проекция XPackageQuery будет включать предыдущую XQuery следующим образом:

public interface XPackageQuery {
    List<XQuery> getXQueries();
    String getCustomerInn();
}

Но при таком подходе результат маппинга следующий:

  • xQueries: всегда null;
  • customerInn: корректный.

Допустимо ли такое использование структуры проекций? И есть ли более рациональные способы решения данной проблемы?

Примечания:

  • выполнял запрос напрямую, данные корректные;
  • в клиентском коде ошибок точно нет.

Ответы (0 шт):