removeif()不在jpa返回的列表上工作

Ced*_*Ced 4 java jpa jpql

我有一些问题理解为什么我不能在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
}
Run Code Online (Sandbox Code Playgroud)

Jör*_*örg 6

这种奇怪行为的典型原因是你有hashCode(和equals)的自定义实现.如果在这种情况下您更改了对象并导致hashCode不同,那么使用JDK集合即使使用iterator.remove()也无法从Set中删除该对象.JDK集合通过重新计算hashCode并使用该哈希执行对象的删除来实现删除.如果散列已经更改,则删除失败并且JDK实现会忽略它,尽管它们会因为删除而返回true,这意味着集合实际上已经改变了甚至很难实现.伤心但真实.