Hibernate - > ArrayList无法强制转换为Set

时间:2010-10-12 11:59:21

标签: java hibernate arraylist set classcastexception

我有一个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

我该怎么做才能避免此错误?

提前谢谢你&amp;最诚挚的问候。

2 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:3)

  

域对象,我将List / ArrayList更改为Set / HashSet,因为最好使用Sets。

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

就个人而言,我不能说我认为将查询结果转换为Set(除了吃更多内存)有很大价值,除非您明确要删除duplicates from query results当然(但在那种情况下,我会挑战映射)。

现在,如果你坚持,各种Set实现都有一个带Collection的构造函数(问题基本上是Easiest way to convert a List to a Set? - Java的副本)。