java - Java如何过滤包含多个嵌套列表级别的JPA对象列表
问题描述
我正在尝试过滤包含多个嵌套列表级别的 JPA 对象列表。我需要根据列表中向下 2 级的条件过滤顶级列表。
我的应用程序得到一个包含 OrderLines 列表的 Orders 列表,其中包含 OrderLineDetails 列表。我正在尝试将 Orders 列表中包含的 orderLineDetail 列表过滤为列表中每个 OrderLine 的最新状态。最终结果应该是包含每个 OrderLine 的最新 OrderLineDetail 的 Orders 列表。我遇到了问题,因为 orderLineDetail 列表是 Order 对象下 2 级的子对象。有人可以提供一个如何做到这一点的例子吗?谢谢你的帮助。
public class Order
private Long orderId;
@OneToMany(
mappedBy = "order",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER)
private List<OrderLine> orderLines = new ArrayList<>();
...
public class OrderLine
private Long orderLineId;
private Timestamp lastUpdate;
@OneToMany(mappedBy = "orderLine", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<OrderLineDetail> orderLineDetails;
@ManyToOne
@JoinColumn(name = "orderId")
private Order order;
...
public class OrderLineDetail
private Long orderLineDetailId;
private Integer status;
private Instant statusTs = Instant.now();
@ManyToOne
@JoinColumn(name = "orderLineId")
private OrderLine orderLine;
...
不确定是否有更好的方法。但这似乎有效。
public List<Order> filterOrdersByMostRecentTs(List<Order> orderList) {
orderList.forEach(order -> {
order.getOrderLine().forEach(line -> {
List<OrderLineDetail> orderLineDetailList = line.getOrderLineDetail();
Map<Object, Object> o =
orderLineDetailList.stream().collect(
Collectors.groupingBy(OrderLineDetail -> OrderLineDetail.getOrderLine().getOrderLineId(),
Collectors.collectingAndThen(
Collectors.reducing((OrderLineDetail d1, OrderLineDetail d2) -> d1.getStatusTs().getEpochSecond() > d2.getStatusTs().getEpochSecond()? d1 : d2),
Optional::get)));
orderLineDetailList.clear();
o.forEach((k, v) -> orderLineDetailList.add((OrderLineDetail) v));
});
});
return orderList;
}
解决方案
推荐阅读
- react-native - 在本机反应中添加长按事件
- php - 覆盖 Laravel 5.2 上的 phpunit
- ios - 在 XCode 上需要帮助:线程 1:EXC_BAD_INSTRUCTION (WebView)
- go - 从选择插入时缓冲通道不阻塞的正确方法是什么?在 goroutine 中做这件事是一种反模式吗
- java - java.sql.SQLException: 无法获得连接,池错误 Timeout waiting for idle object 。如何恢复连接
- mysql - 如何获得精确插入行的 auto_increment 主键?
- c - 用于获取远程服务器主机名的 Linux C API?
- c++ - lex/flex 实现 C/C++ 嵌套`#include "Header"` 语法的解释?
- python - 展平包含字典列表的 pandas 数据框列
- canvas - 如何制作像 bannersnake.com 这样的智能 ReSize 设计功能?