Hibernate -> ArrayList无法转换为Set

10

我有一个Java EE应用程序,使用Hibernate。在域对象中,我将List/ArrayList更改为Set/HashSet,因为使用Set更好。

但是在我的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

我该如何避免这个错误?

先感谢您并致以最好的问候。


3
你确定你知道集合和列表之间的区别吗?因为使用 Set 并不一定比使用 List 更好。当你想要在集合中只保留一个对象实例时,应该使用 Set;而在列表中,你可以有多个相同的对象实例。 - LeChe
2个回答

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

sess.createQuery("from Item").list();将返回一个包含查询结果项的数组列表,如果你需要转换为Set类型,可以按照下面代码中的方法进行转换。


或者重建数据库,但这可能不是一个选项。 - willcodejavaforfood
小问题,应该是 Set<Item> items = new HashSet<Item>(list);。除此之外:+1 - Sean Patrick Floyd
重建数据库可能不是一个选项 - 这没有意义,Query.list() 总是返回一个 List:http://docs.jboss.org/hibernate/stable/core/javadoc/org/hibernate/Query.html#list() - matt b
@mattb,链接已经失效。 - Günay Gültekin

3
领域对象,我将List / ArrayList更改为Set / HashSet,因为使用Set更好。 “更好”不是绝对的,它完全取决于你需要什么。但无论如何,你在领域对象中使用的集合类型和Query#list()的返回类型是两个无关的事情。 就个人而言,我认为将查询结果转换为Set(除了占用更多内存之外)没有太大价值,除非你明确想要从查询结果中删除重复项(但在这种情况下,我会质疑映射)。
现在,如果您坚持,各种Set实现都有一个构造函数,接受一个Collection(这个问题本质上是将List转换为Set的最简单方法?- Java的重复)。

当我需要在JPA/HSQL方面寻求帮助时,你却不见了踪影。但是现在你出现了,太过分了 :) - willcodejavaforfood

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