Java中的比较器和可比较的负面场景



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

1) 使用休眠在数据库中获取值。

2) 获取值存储到类 Bean 列表类型

List<IdentityDocArchive> 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);
              }
            }
        });

4)现在此列表值存储到另一个列表中

我的问题是,如果不是更好的方法,这是正确的实施方式。

您使用 Hibernate,因此您还应该使用 hibernate/JPA 对数据进行排序。通过命名查询order by ...或通过CriteriaQuery.orderBy(...) .您可能还想查看 Java EE 持久性教程。

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

如果您不想对数据库中的数据进行排序,并且列表中没有任何对象和"上次更新日期"属性可以null,则可以像这样按降序实现Comparator

Collections.sort(identityDocList, new Comparator<IdentityDocArchive>() {
            @Override
            public int compare(IdentityDocArchive o1, 
                              IdentityDocArchive o2) {                               
                return o2.getLastUpdtDt().compareTo(o1.getLastUpdtDt());
            }
        });

此解决方案应该比原始解决方案更快,因为它避免了冗余的日期解析。

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

相关内容

  • 没有找到相关文章

最新更新