我有一个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;最诚挚的问候。
答案 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的副本)。