Вопрос

У меня есть приложение 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

Что я могу сделать, чтобы избежать этой ошибки?

Заранее спасибо и с наилучшими пожеланиями.

Это было полезно?

Решение

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

sess.createQuery("from Item").list(); Вернет список ассигновок результирующих элементов, если вам это нужно, вы можете сделать его, как показано в коде

Другие советы

Объекты домена я изменил List/ArrayList на Set/HashSet, потому что лучше использовать Sets.

Не «лучше» использовать Set, это полностью зависит от того, что вам нужно.Но в любом случае тип коллекции, который вы используете в своих объектах домена, и тип возвращаемого значения Query#list() являются две несвязанные вещи.

Лично я не могу сказать, что вижу большую ценность в преобразовании результата запроса в Set (кроме потребления большего количества памяти), если только вы явно не хотите удалить дубликаты из результатов запроса конечно (но в таком случае я бы оспорил сопоставления).

Теперь, если вы настаиваете, различные Set реализации имеют конструктор, который принимает Collection (и вопрос по сути является дубликатом Самый простой способ преобразовать список в набор?- Джава).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top