9

我有一个 Java EE 应用程序并且我使用 Hibernate。域对象,我把List/ArrayList改成了Set/HashSet,因为用Sets比较好。

但是在我的 Dao 实现中我遇到了一个问题:

public Set<Person> getAllPersons() {
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session sess = sessionFactory.getCurrentSession();

    Transaction tx = sess.beginTransaction();
    @SuppressWarnings("unchecked")
    Set<Item> items = (Set<Item>) sess.createQuery("from Item").list();
    tx.commit();

    return items;
}

在这里我得到一个错误:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set

我能做些什么来避免这个错误?

提前感谢您和最诚挚的问候。

4

2 回答 2

23
List<Item> list = sess.createQuery("from Item").list();
Set<Item> items = new HashSet<Item>(list);  

sess.createQuery("from Item").list();将返回结果项目的数组列表,如果您在 Set 中需要它,您可以按照代码所示进行

于 2010-10-12T12:02:07.827 回答
3

域对象,我把List/ArrayList改成了Set/HashSet,因为用Sets比较好。

使用起来并不是“更好” Set,这完全取决于您的需要。但无论如何,您在域对象中使用的集合类型和返回类型Query#list()两个不相关的东西

就个人而言,我不能说将查询结果转换为 a Set(除了消耗更多内存)有多大价值,除非您当然明确地想从查询结果中删除重复项(但在这种情况下,我会挑战映射)。

现在,如果您坚持,各种Set实现都有一个构造函数,它采用 a Collection(问题本质上是Easest way to convert a List to a Set? - Java的副本)。

于 2010-10-12T12:34:37.533 回答