2010-10-12 13 views
8

Ich habe eine Java EE-Anwendung und ich verwende Hibernate. Die Domain-Objekte, ich habe die List/ArrayList in Set/HashSet geändert, weil es besser ist, Sets zu verwenden.Hibernate -> ArrayList kann nicht in Set

Aber in meinem Dao Implementierung ich auf ein Problem stoßen:

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; 
} 

Hier bekomme ich einen Fehler:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set 

Was kann ich tun, um diesen Fehler zu vermeiden?

Vielen Dank im Voraus & Mit freundlichen Grüßen.

+3

Sind Sie sicher, dass Sie wissen, was der Unterschied zwischen einer Menge und einer Liste ist? Weil es in keiner Weise besser ist, ein Set zu verwenden. Sie verwenden Sets immer dann, wenn Sie eine einzelne Instanz eines Objekts in Ihrer Sammlung haben möchten, während Sie mehrere Instanzen desselben Objekts in einer Liste haben können. – LeChe

Antwort

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

sess.createQuery("from Item").list(); eine Array-Liste der resultierenden Produkte zurückgeben, wenn Sie es im Set benötigen, können Sie es machen wie in Code gezeigt

+0

oder erstellen Sie die Datenbank, die möglicherweise keine Option sein – willcodejavaforfood

+0

geringfügiges Problem, sollte es sein Set items = new HashSet (Liste); '. Abgesehen davon: +1 –

+0

"stelle die Datenbank neu her, die keine Option sein könnte" - Das macht keinen Sinn, 'Query.list()' gibt immer eine 'List' zurück: http://docs.jboss.org/hibernate/ stable/core/javadoc/org/hibernate/Query.html # list() –

3

The domain objects, I changed the List/ArrayList to Set/HashSet, because it is better to use Sets.

Es ist nicht „besser“ Set zu verwenden, es hängt ganz auf was du brauchst. Aber egal, der Sammlertyp, den Sie in Ihren Domain-Objekten verwenden, und der Rückgabetyp Query#list() sind zwei nicht verwandte Dinge.

Persönlich kann ich nicht sagen, dass ich viel Wert beim Konvertieren des Ergebnisses einer Abfrage in eine Set (abgesehen von mehr Speicher essen) sehen, es sei denn, Sie möchten natürlich duplicates from query results explizit entfernen (aber in diesem Fall, I würde die Abbildungen herausfordern).

Nun, wenn Sie darauf bestehen, haben die verschiedenen Set Implementierungen einen Konstruktor, der eine Collection (und die Frage ist im Wesentlichen ein Duplikat von Easiest way to convert a List to a Set? - Java).

+0

Wenn ich Hilfe mit JPA/HSQL brauche, ist man nirgends zu sehen, aber Sie erscheinen! unerhört :) – willcodejavaforfood

Verwandte Themen