【问题标题】:Collections.sort doesn't invoke in java 8 [duplicate]Collections.sort 不在 java 8 中调用 [重复]
【发布时间】:2015-09-06 17:46:48
【问题描述】:

我有由 NetBeans 生成的 EJB 外观,并且对 JPA 获取的实体中的集合进行排序不起作用。这是代码:

@Stateless
public class CompetitionFacade extends AbstractFacade<Competition> implements CompetitionFacadeLocal {

@PersistenceContext(unitName = "mot_persistence_unit")
private EntityManager em;

@Override
protected EntityManager getEntityManager() {
    return em;
}

public CompetitionFacade() {
    super(Competition.class);
}

@Override
public Competition findAndInitializeGD(Integer idCompetition) {
    Competition entity = em.find(Competition.class, idCompetition);

    entity.getGroupDetailsList().forEach(p -> System.out.println("First lambda " + p.getIdGroupName()));
    new ArrayList<>(entity.getGroupDetailsList()).forEach(p -> System.out.println("Second lambda " + p.getIdGroupName()));

    Collections.sort(entity.getGroupDetailsList(), new Comparator<GroupDetails>() {

        @Override
        public int compare(GroupDetails o1, GroupDetails o2) {
            throw new UnsupportedOperationException("First sorting");
        }

    });

    Collections.sort(new ArrayList<>(entity.getGroupDetailsList()), new Comparator<GroupDetails>() {

        @Override
        public int compare(GroupDetails o1, GroupDetails o2) {
            throw new UnsupportedOperationException("Second sorting");
        }

    });

    return entity;
}

}

抽象外观:

public abstract class AbstractFacade<T> {
private Class<T> entityClass;

public AbstractFacade(Class<T> entityClass) {
    this.entityClass = entityClass;
}

protected abstract EntityManager getEntityManager();

// auto-generated methods like find/edit etc.
}

调用此方法会出现此异常:

Caused by: java.lang.UnsupportedOperationException: Second sorting

为什么没有从排序中抛出第一个异常?而且看起来 lambda 表达式也不起作用。添加这两行之后

entity.getGroupDetailsList().forEach(p -> System.out.println("First lambda " + p.getIdGroupName()));
new ArrayList<>(entity.getGroupDetailsList()).forEach(p -> System.out.println("Second lambda " + p.getIdGroupName()));

输出是

Info:   Second lambda entities.GroupName[ idGroupName=709 ]
Info:   Second lambda entities.GroupName[ idGroupName=706 ]
Info:   Second lambda entities.GroupName[ idGroupName=707 ]
Info:   Second lambda entities.GroupName[ idGroupName=708 ]

编辑:

这是来自实体的字段

@OneToMany(cascade = CascadeType.ALL, mappedBy = "competition")
private List<GroupDetails> groupDetailsList = new ArrayList<>();

普通吸气剂

public List<GroupDetails> getGroupDetailsList() {
    return groupDetailsList;
}

编辑2: 在接受了正确的答案后,我在https://stackoverflow.com/a/27980037/3803447 找到了令人满意的答案。

【问题讨论】:

  • getGroupDetailsList 返回什么?它可以修改吗?
  • @OneToMany(cascade = CascadeType.ALL, mappedBy = "competition") private List&lt;GroupDetails&gt; groupDetailsList = new ArrayList&lt;&gt;(); 和 getter: public List&lt;GroupDetails&gt; getGroupDetailsList() { return groupDetailsList; } 是的,它是可修改的。我可以向列表中添加新元素。
  • 请编辑问题以包含该附加信息。

标签: java jpa ejb java-8 eclipselink


【解决方案1】:

如果您启用了延迟加载(这是默认设置),那么 getGroupDetailsList 返回的 Collection 实际上是您的 JPA 提供者提供的一个特殊包装类,在您访问它时充当中间人来获取该集合。尝试调试并查看实际返回的类。

【讨论】:

  • 你是对的,返回的列表是org.eclipse.persistence.indirection.IndirectList的一个类。我可以用 EclipseLink 以某种方式改变这种行为吗?
  • 你在第二个排序中做的方式就是这样做的方式,将它重新包装在一个 ArrayList 中。
  • 接受你的回答,因为它帮助我找到了正确的答案。
  • 谢谢!很高兴我能帮上忙。 :)
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 2015-10-21
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多