Collections.sort 未在 java 8 中调用
Collections.sort doesn't invoke in java 8
我有 NetBeans 生成的 EJB facade,但无法对 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<>();
正常getter
public List<GroupDetails> getGroupDetailsList() {
return groupDetailsList;
}
编辑2:
在接受了暗示我正确方法的答案后,我在这里 找到了令人满意的答案。
如果您启用了延迟加载(这是默认设置),那么 getGroupDetailsList
返回的 Collection 实际上是一个特殊的包装器 class,由您的 JPA 提供商提供,充当中间人访问集合后获取集合。尝试调试并查看 class 实际返回的内容。
我有 NetBeans 生成的 EJB facade,但无法对 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<>();
正常getter
public List<GroupDetails> getGroupDetailsList() {
return groupDetailsList;
}
编辑2:
在接受了暗示我正确方法的答案后,我在这里
如果您启用了延迟加载(这是默认设置),那么 getGroupDetailsList
返回的 Collection 实际上是一个特殊的包装器 class,由您的 JPA 提供商提供,充当中间人访问集合后获取集合。尝试调试并查看 class 实际返回的内容。