【发布时间】:2020-07-30 01:53:16
【问题描述】:
我正在使用 Spring JPA 规范来创建条件查询。我的代码如下所示:
public CollectionWrapper<OrderTableItemDto> getOrders(Integer page,
Integer size,
String search,
OrderShow show) {
Pageable pageable = PageRequest.of(page, size, Sort.by(OrderEntity_.ID).descending());
try {
Specification<OrderEntity> specifications = buildOrderSpecification(show, search);
Page<OrderEntity> orders = orderDao.findAll(specifications, pageable);
List<OrderTableItemDto> result = orders.getContent().stream().map(order -> {
OrderTableItemDto orderTableItemDto = new OrderTableItemDto();
orderTableItemDto.setCreatedDate(order.getCreatedDate());
orderTableItemDto.setCustomerId(order.getCustomer().getId());
orderTableItemDto.setId(order.getId());
orderTableItemDto.setStatus(order.getStatus());
orderTableItemDto.setTotalCost(order.getTotalCost());
orderTableItemDto.setOrderType(order.getOrderType());
orderTableItemDto.setOrderTypeLabel(order.getOrderType().getLabel());
if(order.getOrderInShippingMethod() != null) {
orderTableItemDto.setShipped(OrderShippingStatus.DELIVERED.equals(order.getOrderInShippingMethod().getStatus()));
} else {
orderTableItemDto.setShipped(false);
}
StringBuilder sb = new StringBuilder();
sb.append("#")
.append(order.getId())
.append(" ");
if(order.getOrderType().equals(OrderType.WEB_STORE)) {
sb
.append(order.getBilling().getFirstName())
.append(" ")
.append(order.getBilling().getLastName());
} else {
sb.append(order.getCustomer().getFullName());
}
orderTableItemDto.setTitle(sb.toString());
return orderTableItemDto;
}).collect(Collectors.toList());
return new CollectionWrapper<>(result, orders.getTotalElements());
有人告诉我这是不好的方法,我应该使用投影 (DTO) 从数据库中读取数据,因为创建实体并在之后映射它们的成本很高。问题是我不知道如何将规范与 DTO 结合起来。使用包含嵌套 DTO 和许多属性的复杂 DTO 来管理复杂和动态查询(来自用户输入的过滤器等)的最佳方法是什么?
【问题讨论】:
标签: hibernate spring-boot jpa spring-data-jpa dto