Выбор сущностей, а затем создание DTO обычно является пустой тратой, поскольку сущности обычно имеют намного больше столбцов, чем вам действительно нужно. Если вы используете где-то нетерпеливое извлечение, вы также будете делать ненужные объединения. Если у вас есть вложенные коллекции или сложные выражения, которые вы хотите получить, проверьте Blaze-Persistence Entity-Views , библиотеку, которая работает поверх JPA и позволяет сопоставлять произвольные структуры с вашей моделью сущностей. Это позволяет вам отделить прогноз от вашей бизнес-логики c, то есть вы можете применить этот DTO к существующему запросу. Представление сущности для вашего варианта использования может выглядеть следующим образом
@EntityView(OrderEntity.class)
interface OrderTableItemDto {
@IdMapping
Long getId();
Date getCreatedDate();
String getStatus();
BigDecimal getTotalCost();
@Mapping("orderType.label")
String getOrderTypeLabel();
@Mapping("CASE WHEN orderInShippingMethod.status = OrderShippingStatus.DELIVERED THEN true ELSE false END")
boolean isShipped();
@Mapping("CONCAT('#', id, CASE WHEN orderType = OrderType.WEB_STORE THEN CONCAT(billing.firstName, ' ', billing.lastName) ELSE customer.fullName END)")
String getTitle();
}
Благодаря интеграции данных пружины, предоставляемой Blaze-Persistence, вы можете определить подобное хранилище и напрямую использовать результат
@Transactional(readOnly = true)
interface OrderRepository extends Repository<OrderEntity, Long> {
Page<OrderTableItemDto> findAll(Specification<OrderEntity> specification, Pageable pageable);
}
Он сгенерирует запрос, который выберет именно то, что вы отобразили в OrderTableItemDto
.