java中的Comparator和可比较的负面场景

java中的Comparator和可比较的负面场景,java,hibernate,web-services,collections,Java,Hibernate,Web Services,Collections,我正在使用java实现web服务。 在此实现中,有以下步骤 1) 使用hibernate将值提取到数据库中 2) 将值存储在类bean列表类型中 List<IdentityDocArchive> resultList = q.getResultList(); List resultList=q.getResultList(); 3) 然后我对上次更新日期进行排序 Collections.sort(identityDocList, new Comparator<Iden

我正在使用java实现web服务。 在此实现中,有以下步骤

1) 使用hibernate将值提取到数据库中

2) 将值存储在类bean列表类型中

List<IdentityDocArchive> resultList = q.getResultList();  
List resultList=q.getResultList();
3) 然后我对上次更新日期进行排序

 Collections.sort(identityDocList, new Comparator<IdentityDocArchive>() {
            DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
            @Override
            public int compare(IdentityDocArchive o1, IdentityDocArchive o2) {
            try {
                  return f.parse(o2.getLastUpdtDt().toString()).compareTo(f.parse(o1.getLastUpdtDt().toString()));
              } catch (ParseException e) {
                  LOGGER.warning("Failed To Parsing string to date ".concat(e.getMessage()));
                  throw new IllegalArgumentException(e);
              }
            }
        });
Collections.sort(identityDocList,newcomparator()){
DateFormat f=新的简化格式(“yyyy-MM-dd-HH:MM:ss.S”);
@凌驾
公共整数比较(identitydocachive o1,identitydocachive o2){
试一试{
返回f.parse(o2.GetLastUpdtt().toString()).compareTo(f.parse(o1.GetLastUpdtt().toString());
}捕获(解析异常){
LOGGER.warning(“未能解析到日期的字符串”。concat(e.getMessage());
抛出新的IllegalArgumentException(e);
}
}
});
4) 现在,此列表值存储到另一个列表中


我的问题是,如果不是更好的方法,那么这是实现的正确方法。

您使用Hibernate,因此您还应该使用Hibernate/JPA对数据进行排序。可通过
订购人…
或通过。 您可能还想查看有关这方面的信息


您也可以使用
Collections.sort
手动对其进行排序,但这样您就完成了数据库的预期工作。(免责声明:您当然应该相应地设置数据库:索引等)

如果您不想对数据库中的数据进行排序,并且如果列表中的任何对象和“上次更新日期”属性都不能为
null
,您可以按降序实现
比较器

Collections.sort(identityDocList, new Comparator<IdentityDocArchive>() {
            @Override
            public int compare(IdentityDocArchive o1, 
                              IdentityDocArchive o2) {                               
                return o2.getLastUpdtDt().compareTo(o1.getLastUpdtDt());
            }
        });
Collections.sort(identityDocList,newcomparator()){
@凌驾
公共int比较(识别卡o1,
识别碳原子o2){
返回o2.GetLastUpdtt().compareTo(o1.GetLastUpdtt());
}
});
此解决方案应该比原始解决方案更快,因为它避免了冗余的日期解析


关于在数据库中排序还是在内存中排序更好,这取决于。在某些情况下,Hibernate可能会在查询中生成一个
ORDER BY
子句,这会影响整体性能,从而加快内存排序速度。可能在大多数情况下,两种备选方案的性能非常相似。但是您需要自己尝试一下。

java.util.Date
s是可比较的,所以日期解析部分似乎没有必要。为什么不在查询中排序呢?假设
getLastUpdtt()
返回一个
Date
@mick实际上上次更新日期是数据库中的日期类型字段。当see响应时,则使用show with time和for entity@Temporal(TemporalType.DATE)private java.util.DATE lastupdate@mick it正在处理我的live项目,但只是更好地理解了一个问题,但当它存储在列表中时,我的be it索引将发生更改抱歉。。。请您重新表述一下您的评论好吗?排序后,存储在列表中的值可能会发生更改。它不显示值排序顺序如果值发生更改,数据库值是否也应该更改?如果您有数百万个数据条目,并且当前正在使用20个条目的窗口,您会怎么做?你真的想只对这20个进行排序吗?罗兰,这是一个实时场景。所以我不是在谈论记录的数量。我做到了这一点,但我知道什么是更好的方法,使列表排序或数据库排序