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

时间:2017-01-31 13:00:11

标签: java hibernate web-services collections

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

1)在数据库中使用hibernate fetch值。

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)现在这个列表值存储在另一个列表中

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

2 个答案:

答案 0 :(得分:1)

您使用Hibernate,因此您还应该使用hibernate / JPA对数据进行排序。通过named query order by ...CriteriaQuery.orderBy(...)。 您可能还想查看Java EE persistence tutorial

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

答案 1 :(得分:0)

如果您不想对数据库中的数据进行排序,并且列表中没有任何对象且“上次更新日期”属性都不是null,那么您可以实现{ {1}}这样下降顺序:

Comparator

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

关于在DB中排序还是在内存中排序更好,取决于。在某些情况下,Hibernate可能会在查询中生成一个Collections.sort(identityDocList, new Comparator<IdentityDocArchive>() { @Override public int compare(IdentityDocArchive o1, IdentityDocArchive o2) { return o2.getLastUpdtDt().compareTo(o1.getLastUpdtDt()); } }); 子句,这会损害整体性能,从而使内存中的排序更快。可能在大多数情况下,两种替代方案的性能非常相似。但你需要亲自尝试一下。