【发布时间】:2023-11-13 20:13:01
【问题描述】:
我在理解为什么我不能在 jpa 返回的集合上使用 removeIf() 时遇到了一些问题,但我可以使用迭代器来执行此操作。
@PersistenceContext(unitName = "my-pu")
private EntityManager em;
@Override
public void removeUserFromGroup(String username, Group group) {
Query query = em.createNamedQuery("Group.getByName", Group.class);
query.setParameter("name", group.getGroupName());
Group qGroup = (Group) query.getSingleResult();
// this works
// Iterator<User> i = qGroup.getUsers().iterator();
// while (i.hasNext()) {
// User o = i.next();
// if (o.getUsername().equals(username)) {
// System.out.println("eqqq");
// i.remove();
// }
// }
System.out.println("class: " + qGroup.getUsers().getClass().getName());
// org.eclipse.persistence.indirection.IndirectList
qGroup.getUsers().removeIf(u -> u.getUsername().equals(username));// doesn't work
}
【问题讨论】:
-
这很难相信,因为 removeIf() 默认实现基本上是您发布的注释代码。顺便说一句,我不知道你在看哪个文档,但eclipse.org/eclipselink/api/2.6/org/eclipse/persistence/… 清楚地表明 IndirectList 实现了 List。它甚至扩展了 Vector。
-
@JBNizet 你说得对,它确实实现了列表,我刚醒来,我错过了它。
-
@JBNizet 但我很肯定 lambda expr 对我不起作用,而迭代器起作用。
-
你有什么错误吗?实际结果是什么?恐怕“不起作用”在这里描述得不够充分。顺便说一句,您可以尝试使用
TypedQuery而不是Query以避免在调用query.getSingleResult()时进行强制转换 -
@Sva.Mu 感谢您的提示。不起作用我的意思是我没有错误并且列表的大小保持不变。我不确定如何检查内部发生的情况?