Java中Comparator和Comparable的负面情境

3
我正在使用Java实现Web服务。在这个实现中,以下是需要遵循的步骤:
1)使用Hibernate将值提取到数据库中。
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) 现在将此列表值存储到另一个列表中。

我的问题是,如果不是这样实现的正确方式,那么有更好的方法吗?


3
java.util.Date是可比较的,因此日期解析部分似乎是不必要的。 - Mick Mnemonic
为什么不在查询中排序? - lexicore
假设 getLastUpdtDt() 返回一个 Date - Mick Mnemonic
@mick 实际上,最后更新日期是数据库中的DATE类型字段。当在响应中查看时,使用时间显示,并使用@ Temporal(TemporalType.DATE)实体。 私有java.util.Date lastupdate; - JDevil
@mick,它在我的实际项目中运行良好,但只是理解更好的方法。 - JDevil
2个回答

1
您使用Hibernate,因此应该使用hibernate/JPA对数据进行排序。可以通过命名查询 order by ... 或者通过 CriteriaQuery.orderBy(...) 进行排序。 您还可以使用Collections.sort手动排序,但这样做就是在执行数据库的本意。(免责声明:当然,您应该相应地设置数据库:索引等。) 您可能还想查看Java EE持久性教程

但是当它被存储到列表中时,它的索引可能会发生变化。 - JDevil
抱歉...您能否重新表达一下您的评论? - Roland
排序后存储到列表中的值可能会发生变化。它不显示值的排序顺序。 - JDevil
如果值发生变化,数据库的值也应该随之改变,对吗?如果您有数百万条数据记录,并且当前正在使用20条记录窗口,您会怎么做?您真的只想对这20条进行排序吗? - Roland
Roland这是实时场景。所以我不是在谈论记录数。我已经实现了这一点,但我知道更好的方法是将列表排序还是按数据库排序。 - JDevil

0

如果您不想在数据库中对数据进行排序,并且列表中的所有对象以及“最后更新日期”属性都不可能为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 子句,这会影响整体性能,使内存排序更快。在大多数情况下,两种方法的性能相当。但你需要自己试一试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接