【发布时间】:2023-01-09 23:47:41
【问题描述】:
我有一个 List,它是 Criteria.list() 的结果。 Criteria 根据我选择的数据类型从不同的表中检索数据。
我有三个实体,它们通过 Hibernate 链接到表:
File.java
// fields
// getters and setters
Refund.java
// fields
private RefundState refundState;
// getters and setters
Quotation.java
// fields
private QuotationState quotationState;
// getters and setters
Refund 和 Quotation 类扩展文件。因此,Refund 和 Quotation 有一些共同的字段,如果我想按类型独立获取所有文件,我可以。
但这会产生一个大问题。当我检索所有文件(退款和报价)时,我需要排除具有特定状态的报价和退款。报价单和退款的状态不同,所以我不能在 Criteria 中应用 Where condition。
所以,我想我必须手动从结果列表中删除元素。我可以,通过list.removeIf(Predicate)。
但是,由于 List 是多种类型的混合,我不能只是 cast,像这样:
list.removeIf(elem -> (((Refund) elem).getRefundState().getCode().equals("A")));
..因为,当elem 是报价单时它会中断。
所以,我想到了内联一个 if,就像这样:
list.removeIf(elem -> (elem instanceof Refund ? ((Refund) elem).getRefundState().getCode().equals("A")));
但它甚至不编译。它说缺少一个括号。
我应该避免使用 forEach,因为 ResultSet 可能非常大。
我不能更改任何课程。
我应该避免制作两个不同的Criterias 并合并这两个列表。我在执行此 removeIf 的类中应用了我无法检索的其他 Where conditions。
【问题讨论】:
标签: java list hibernate arraylist lambda