【问题标题】:Hibernate -> ArrayList cannot be cast to SetHibernate -> ArrayList 不能强制转换为 Set
【发布时间】:2011-04-24 06:49:57
【问题描述】:

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

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

在此先感谢您并致以最诚挚的问候。

【问题讨论】:

  • 你确定你知道集合和列表的区别是什么吗?因为使用 Set 绝不是“更好的”。只要您想要集合中的一个对象的单个实例,您就可以使用 Set,而您可以在一个列表中拥有同一对象的多个实例。

标签: java hibernate arraylist set classcastexception


【解决方案1】:
List<Item> list = sess.createQuery("from Item").list();
Set<Item> items = new HashSet<Item>(list);  

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

【讨论】:

  • 或重建数据库,这可能不是一个选项
  • 小问题,应该是Set&lt;Item&gt; items = new HashSet&lt;Item&gt;(list);。除此之外:+1
  • "重建数据库,这可能不是一个选项" - 这没有意义,Query.list() 总是返回 List: docs.jboss.org/hibernate/stable/core/javadoc/org/hibernate/…
  • @mattb 链接已损坏。
【解决方案2】:

域对象,我把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 的副本)。

【讨论】:

  • 当我需要 JPA/HSQL 方面的帮助时,你无处可寻,但你出现了!离谱:)
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2019-06-09
  • 1970-01-01
  • 2017-06-02
  • 2013-07-21
相关资源
最近更新 更多