我有一些问题理解为什么我不能在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)
这种奇怪行为的典型原因是你有hashCode(和equals)的自定义实现.如果在这种情况下您更改了对象并导致hashCode不同,那么使用JDK集合即使使用iterator.remove()也无法从Set中删除该对象.JDK集合通过重新计算hashCode并使用该哈希执行对象的删除来实现删除.如果散列已经更改,则删除失败并且JDK实现会忽略它,尽管它们会因为删除而返回true,这意味着集合实际上已经改变了甚至很难实现.伤心但真实.
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |