9

私はJavaEEアプリケーションを持っており、Hibernateを使用しています。ドメインオブジェクトでは、Setsを使用する方がよいため、List/ArrayListをSet/HashSetに変更しました。

しかし、私の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

このエラーを回避するにはどうすればよいですか?

よろしくお願いします。

4

2 に答える 2

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

sess.createQuery("from Item").list();結果のアイテムの配列リストを返します。Setで必要な場合は、コードに示すように作成できます。

于 2010-10-12T12:02:07.827 に答える
3

ドメインオブジェクトでは、Setsを使用する方がよいため、List/ArrayListをSet/HashSetに変更しました。

使用するのは「良い」というわけではなくSet、必要なものに完全に依存します。ただし、とにかく、ドメインオブジェクトで使用するコレクションタイプとのリターンタイプはQuery#list()2つの無関係なものです。

個人的には、もちろんクエリ結果から重複Setを明示的に削除したい場合を除いて、クエリの結果を(より多くのメモリを消費することを除いて)変換することに大きな価値があるとは言えません(ただし、その場合は挑戦しますマッピング)。

さて、あなたが主張するなら、さまざまな実装には、 (そして問題は本質的にリストをセットに変換する最も簡単な方法の複製ですか?-JavaSet )を取るコンストラクターがあります。Collection

于 2010-10-12T12:34:37.533 に答える