Можно ли использовать вложенные проекции в 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: корректный.
Допустимо ли такое использование структуры проекций? И есть ли более рациональные способы решения данной проблемы?
Примечания:
- выполнял запрос напрямую, данные корректные;
- в клиентском коде ошибок точно нет.