Hibernate -> ArrayList не может быть приведен к Set - PullRequest
9 голосов
/ 12 октября 2010

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

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

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

Ответы [ 2 ]

23 голосов
/ 12 октября 2010
List<Item> list = sess.createQuery("from Item").list();
Set<Item> items = new HashSet<Item>(list);  

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

3 голосов
/ 12 октября 2010

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

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

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

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

...