首页 > 解决方案 > 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;
  }

标签: javalistjpafilter

解决方案


推荐阅读